用于单例类对象的Ruby祖先方法



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]

问题:

  1. 为什么在singleton_class对象上调用方法时接收器不包含在祖先列表中?我希望B.singleton_class.ancestors等于[B, ClassMethods, Class, Module, Object, Kernel, BasicObject]

  2. 我认为B的单例类的祖先路径应该更像这样(这是不完美的,因为它不应该使用模块的单例类):

B.singleton_class.ancestors.map(&:singleton_class) # => [#<Class:ClassMethods>, #<Class:Class>, #<Class:Module>, #<Class:Object>, #<Class:Kernel>, #<Class:BasicObject>]

我通常使用祖先查看继承链,以便更好地了解Ruby的方法查找。也许这种方法不太适合这项任务。祖先的方法适合于什么任务?

我想你一定会喜欢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

最新更新