【问题标题】:Ruby ancestors method for singleton class objects单例类对象的 Ruby 祖先方法
【发布时间】:2014-05-23 12:36:38
【问题描述】:

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(&amp;:singleton_class) # =&gt; [#&lt;Class:ClassMethods&gt;, #&lt;Class:Class&gt;, #&lt;Class:Module&gt;, #&lt;Class:Object&gt;, #&lt;Class:Kernel&gt;, #&lt;Class:BasicObject&gt;]

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

【问题讨论】:

    标签: ruby


    【解决方案1】:

    我想你会非常喜欢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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-14
      • 2017-02-20
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      相关资源
      最近更新 更多