如何找到祖先链的任何方法?

时间:2014-03-04 02:51:44

标签: ruby

class Taco
  # . . .
end

获得祖先链:

Taco.ancestors
 #=> [Taco, Object, Kernel, BasicObject]

说我想找到“父”类,它是ruby定义方法的祖先链。我该怎么做呢?

E.g。 method_missing.parent.ancestors

如果所有应该从BasicObject继承,为什么不Kernel

Object.ancestors
 #=> [Object, Kernel, BasicObject]

Kernel.ancestors
 #=> [Kernel]

BasicObject.ancestors
 #=> [BasicObject]

同样Class继承自ClassModule,但为什么我的Taco类祖先的链不会从它们继承而是直接从Object转发继承?

Class.ancestors
#=> [Class, Module, Object, Kernel, BasicObject]

2 个答案:

答案 0 :(得分:6)

您正在寻找owner

method(:puts).owner 
  #=> Kernel
method(:puts).owner.ancestors
  #=> [Kernel]

回到你的炸玉米饼示例:

class Taco
  def self.eat
    "YUM"
  end
end

Taco.method(:eat).owner
  #=> #<Class:Taco>
Taco.method(:eat).owner.ancestors
  #=> [Class, Module, Object, PP::ObjectMixin, Kernel, BasicObject]

内核是module的一个实例。看看这个:

Kernel.class.ancestors
  #=> [Module, Object, PP::ObjectMixin, Kernel, BasicObject]

如果您感兴趣,这里有一些关于ruby对象模型的further reading。此外,这是从谷歌图像中窃取的图像,可能有助于巩固这些概念。

ruby object model

答案 1 :(得分:0)

特别是关于您的问题:“Class继承自ClassModule,但为什么我的Taco类祖先的链不会从它们继承而是直接从{继承} {1}}前进?“

ObjectTaco实例,但其超类Class。实例关系和超类关系是两个完全不同的东西。

例如:假设您创建了一个带有子类Object的类AnimalDog将为您提供一个Animal.new实例对象。 Animal Dog的实例(它本身不是动物 - 相反,它定义了一种动物)。它的超类Animal

每个对象都是某个类的实例 - 调用Animal来找出哪一个。但并非所有对象都有超类 - 只有class的实例。

此外,Class不会从Class继承。那是不可能的。 所有类出现在他们自己的Class的开头,但这并不意味着他们继承自己。这就是ancestors方法的工作原理。