为什么在单例类中定义的方法(self
)中的singleton2
与其他三种情况中的单独类不相等?
class A
def self.singleton1
class << self
self
end
end
class << self
def singleton2
self
end
end
end
def singleton3
class << A
self
end
end
p [A.singleton1, A.singleton1.object_id] # [#<Class:A>, 70003841656620]
p [A.singleton2, A.singleton2.object_id] # [A, 70003841656640]
p [singleton3, singleton3.object_id] # [#<Class:A>, 70003841656620]
p [A.singleton_class, A.singleton_class.object_id] # [#<Class:A>, 70003841656620]
答案 0 :(得分:3)
我将逐一解释。
def self.singleton1
class << self
self
end
end
此处,方法内的self
为A
。现在,在方法中,您正在使用A
创建另一个范围,即class << self
的单例类的范围。当您调用self
时,将返回单例类的A.singeton1
,因为self
的单例类中的A
是方法{{1}的最后一个语句}。
singleton1
这里,class << self
def singleton2
self
end
end
的单体类体内的self
是单体类本身。现在,您在类A
上定义了单例方法singleton2
。在方法内部,最后一个表达式是A
,它始终设置为self
,此处为receiver
。还有一件事,A
创建了一个新的范围,它与def singleton2
的单例类的范围不同。
根据上述说明,我希望以下代码输出必须清楚: -
A
输出class A
def self.singleton1
class << self
self
end
end
class << self
def singleton2
self
end
end
end
A.singleton2 # => A
A.singleton1 # => #<Class:A>
和A
清楚地说明#<Class:A>
为何不同。
从上面的两个解释中可以清楚地了解object_id
的内容。