Ruby文档有一个简单的Module#ancestors方法定义,该方法讨论了祖先在模块上调用时返回的内容,但没有说明何时在类上调用祖先。
返回mod中包含的模块列表(包括mod本身)。
我试图破解祖先方法的目的,当它在类上调用时,尤其是单例类对象。这是一个例子:
module InstanceMethods; end
module ClassMethods; end
class A; end
class B < A
include InstanceMethods
extend ClassMethods
end
B.ancestors # => [B, InstanceMethods, A, Object, Kernel, BasicObject]
B.singleton_class.ancestors # => [ClassMethods, Class, Module, Object, Kernel, BasicObject]
问题:
为什么在singleton_class对象上调用方法时接收器不包含在祖先列表中?我希望B.singleton_class.ancestors
等于[B, ClassMethods, Class, Module, Object, Kernel, BasicObject]
我认为B&amp;单例类的祖先路径应该更像这样(这并不完美,因为它不应该使用单例类模块):
B.singleton_class.ancestors.map(&:singleton_class) # => [#<Class:ClassMethods>, #<Class:Class>, #<Class:Module>, #<Class:Object>, #<Class:Kernel>, #<Class:BasicObject>]
我通常使用祖先查看继承链并更好地了解Ruby的方法查找。也许这种方法不适合这项任务。祖先方法最适合的任务是什么?
答案 0 :(得分:3)
我认为你真的很喜欢ruby 2.1
然后!
$ rbenv local 2.1.0
roman.brodetski@nb-rbrodetski []
$ irb
...
irb(main):008:0> B.singleton_class.ancestors
=> [#<Class:B>, ClassMethods, #<Class:A>, #<Class:Object>, #<Class:BasicObject>, Class, Module, Object, Kernel, BasicObject]
irb(main):009:0>
我认为你的思想与语言开发人员同步是一件好事!
以下是redmine问题:https://bugs.ruby-lang.org/issues/8035