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

fab*_*bbb 1 ruby

class Taco
  # . . .
end
Run Code Online (Sandbox Code Playgroud)

获得祖先链:

Taco.ancestors
 #=> [Taco, Object, Kernel, BasicObject]
Run Code Online (Sandbox Code Playgroud)

假设我想找到"父"类,它是ruby定义方法的祖先链.我该怎么做呢?

例如 method_missing.parent.ancestors

如果一切都应该继承,BasicObject为什么不Kernel呢?

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

Kernel.ancestors
 #=> [Kernel]

BasicObject.ancestors
 #=> [BasicObject]
Run Code Online (Sandbox Code Playgroud)

此外Class,从继承ClassModule但为什么我的Taco类祖先的链没有从他们那里继承,而是直接继承自Object前行?

Class.ancestors
#=> [Class, Module, Object, Kernel, BasicObject]
Run Code Online (Sandbox Code Playgroud)

Jos*_*osh 8

您正在寻找所有者.

method(:puts).owner 
  #=> Kernel
method(:puts).owner.ancestors
  #=> [Kernel]
Run Code Online (Sandbox Code Playgroud)

回到你的taco例子:

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]
Run Code Online (Sandbox Code Playgroud)

内核是一个实例module.看一下这个:

Kernel.class.ancestors
  #=> [Module, Object, PP::ObjectMixin, Kernel, BasicObject]
Run Code Online (Sandbox Code Playgroud)

如果您有兴趣,可以在这里进一步阅读 ruby对象模型.此外,这是从谷歌图像窃取的图像,可能有助于巩固这些概念.

红宝石对象模型