【发布时间】: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]
问题:
为什么在 singleton_class 对象上调用方法时,接收方不包含在祖先列表中?我本来希望
B.singleton_class.ancestors等于[B, ClassMethods, Class, Module, Object, Kernel, BasicObject]我认为 B 的单例类的祖先路径应该更像这样(这并不完美,因为它不应该使用模块的单例类):
B.singleton_class.ancestors.map(&:singleton_class) # => [#<Class:ClassMethods>, #<Class:Class>, #<Class:Module>, #<Class:Object>, #<Class:Kernel>, #<Class:BasicObject>]
我通常使用祖先视图来查看继承链并更好地了解 Ruby 的方法查找。也许该方法不太适合这项任务。祖先方法非常适合什么任务?
【问题讨论】:
标签: ruby