2015-06-19 4 views
1

я определил Методы specific_data1 и specific_data2 в мета-классе, и ожидался, эти методы относятся к одноплодному классу:Что такое метод singleton_class в классе и объекте?

class User 
    def User.specific_data1 
    "user specific data defined on user" 
    end 
    class << self 
    def specific_data2 
     "user specific data defined in meta class" 
    end 
    end 
end 

Но ни один из методов найдено в:

User.singleton_class.methods 

Пожалуйста, помогите мне понять, что singleton_method на User класс есть и как это полезно.

ответ

3

Object#methods возвращает методы этого объекта. Методы, определенные в классе, не являются методами этого объекта класса, они являются методами экземпляров этого класса.

Это не имеет ничего общего с одноэлементными классами, это верно для всех классов:

class Foo 
    def bar; end 
end 

Foo.methods.include?(:bar) 
# => false 

Foo.new.methods.include?(:bar) 
# => true 

Foo.instance_methods 
# => [:bar] 

Вот как это работает с вашим примером:

User.methods.grep(/specific/) 
# => [:specific_data1, :specific_data2] 

User.singleton_methods 
# => [:specific_data1, :specific_data2] 

User.singleton_class.instance_methods.grep(/specific/) 
# => [:specific_data1, :specific_data2] 
+0

Вы правы, но я беспокоюсь, почему они не появляются на объекте singleton_class. Являются ли они не принадлежащими к singleton class (meta class) – pramod

+0

Это методы экземпляра одноэлементного класса, что означает, что они являются методами экземпляров одноэлементного класса, т. Е. Являются методами 'User'. Он действительно работает так же, как и любой другой класс. Методы экземпляра 'String' - это методы экземпляров' String', а не '' String'. Вы можете «разбить» экземпляр «String», вы не можете «разбить» класс «String». И так далее. –

+0

Таким образом, метод User.singleton_class возвращает то, что – pramod

0

оба методы вы определили определяются как методы экземпляра на singleton_class.

User.singleton_class.instance_methods(false) 
# => [:specific_data1, :specific_data2] 
0

Jorg получил техническую часть вашего вопроса правильно. Вы хотите проверить

User.singleton_class.instance_methods 

Как для этого

Пожалуйста, помогите мне понять, что singleton_method на User класса и как это полезно.»

Предположим, у вас есть объект x и вы хотите определить метод для него. Один из способов - определить метод в классе x, но это имеет побочный эффект от определения метода для всех o ther objects этого класса! Что делать, если вы просто хотите определить метод для объект x?

Ruby решает эту проблему, создавая класс, который имеет только экземпляр: x. Это класс singleton. Определенные в нем методы будут влиять только на x, поскольку класс singleton является подклассом x.class, и его единственным экземпляром является x. Методы Singleton - это просто регулярные методы, определенные в одноэлементном классе.