我在元类中定义了方法specific_data1
和specific_data2
,并期望这些方法属于单例类:
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
及其有用的内容。
答案 0 :(得分: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]
答案 1 :(得分:0)
您定义的两个方法都定义为singleton_class上的实例方法。
User.singleton_class.instance_methods(false)
# => [:specific_data1, :specific_data2]
答案 2 :(得分:0)
Jorg正确地解决了你的问题的技术部分。你想检查
User.singleton_class.instance_methods
至于这个
请帮助我了解
singleton_method
课程User
及其有用之处。&#34;
假设您有一个对象x
,并且您想为它定义一个方法。一种方法是在x
的类中定义方法,但这会产生为该类的所有其他对象定义方法的副作用!如果您只想为单个对象x
定义方法,该怎么办?
Ruby通过让你创建一个只有单个实例的类来解决这个问题:x
。这是单身人士课程。其中定义的方法只会影响x
,因为单例类是x.class
的子类,其唯一的实例是x
。单例方法只是单例类中定义的常规方法。