单例类对象的Ruby祖先方法

时间:2014-05-23 12:36:39

标签: 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&amp;单例类的祖先路径应该更像这样(这并不完美,因为它不应该使用单例类模块):

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

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

1 个答案:

答案 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