什么是类和对象中的“singleton_class”方法?
Posted
技术标签:
【中文标题】什么是类和对象中的“singleton_class”方法?【英文标题】:What is `singleton_class` method in class and object? 【发布时间】:2015-09-05 09:11:11 【问题描述】:我在元类中定义了方法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
请帮助我了解User
课程中的singleton_method
是什么以及它有什么用处。
【问题讨论】:
【参考方案1】: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]
【讨论】:
你是对的,但我担心的是为什么它们没有出现在 singleton_class 对象上。他们不属于单例类(元类) 它们是单例类的实例方法,也就是说它们是单例类的实例方法,即它们是User
的方法。它真的像任何其他类一样工作。 String
的实例方法是String
实例的方法,而不是String
类本身。你可以split
String
的一个实例,你不能split
String
类。以此类推。
那么 User.singleton_class 方法返回什么
返回User
的单例类。【参考方案2】:
您定义的两个方法都定义为 singleton_class 上的实例方法。
User.singleton_class.instance_methods(false)
# => [:specific_data1, :specific_data2]
【讨论】:
【参考方案3】:Jorg 正确理解了您问题的技术部分。你要检查
User.singleton_class.instance_methods
至于这个
请帮助我了解
User
课程中的singleton_method
是什么以及它有什么用处。”
假设你有一个对象x
,你想为它定义一个方法。一种方法是在x
的类中定义方法,但这具有为该类的所有其他对象定义方法的副作用!如果你只想为single对象x
定义方法怎么办?
Ruby 通过让您创建一个只有一个单个 实例的类来解决这个问题:x
。这是单例类。其中定义的方法只会影响x
,因为单例类是x.class
的子类,它的唯一实例是x
。单例方法只是在单例类中定义的常规方法。
【讨论】:
以上是关于什么是类和对象中的“singleton_class”方法?的主要内容,如果未能解决你的问题,请参考以下文章