环境:ruby2.3.2
问题:
- 为什么下面两者的 ancestors 差这么多,A 与 A.singleton_class 有哪些关联与不同?
- 与 A.ancestors 相比 A.singleton_class.ancestors 中 #<Class:A>, #<Class:Object>类似这些东西是什么?
class A
end
A.ancestors
# => [A, Object, Kernel, BasicObject]
A.singleton_class.ancestors
# => [#<Class:A>, #<Class:Object>, #<Class:BasicObject>, Class, Module, Object, Kernel, BasicObject]
问题:
- 为什么不是一个 singleton_class 也可以定义 singleton_method ?
- 现在可以推出,A 与 A.singleton_class 是完全不同的东西,那么 A.singleton_class 存在的意义是什么?
class A
def self.say
p 'say'
end
end
A.singleton_methods
# => [:say]
A.singleton_class.singleton_methods
# => [:constants, :nesting] 方法中没有:say,这个可以理解,因为它的ancestors中没有A。
A.singleton_class?
# => false
A.singleton_class.singleton_class?
# => true
问题:
- 如果说 A.say 是一个 singleton_method,也是一个类方法,那么 a1.run 是一个 singleton_method,也是一个类方法?
- 类方法与 singleton_method 有什么关系与不同?
class A
def self.say
p 'say'
end
end
A.singleton_methods
# => [:say]
a1 = A.new
def a1.run
p 'run'
end
a1.singleton_methods
# => [:run]
问题:
- #<Class:#<A:0x000000010ac200>> 这是什么东西?实例变量也是一个类?
class A
def self.say
p 'say'
end
end
a1 = A.new
# => #<A:0x000000010ac200>
a1.singleton_class.ancestors
#=> [#<Class:#<A:0x000000010ac200>>, A, Object, Kernel, BasicObject]
a1.singleton_class.singleton_methods
# => [:say] # 因为ancestor中有 A, 所以继承了:say方法