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
继承自Class
和Module
,但为什么我的Taco
类祖先的链不会从它们继承而是直接从Object
转发继承?
Class.ancestors
#=> [Class, Module, Object, Kernel, BasicObject]
答案 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。此外,这是从谷歌图像中窃取的图像,可能有助于巩固这些概念。
答案 1 :(得分:0)
特别是关于您的问题:“Class
继承自Class
和Module
,但为什么我的Taco
类祖先的链不会从它们继承而是直接从{继承} {1}}前进?“
Object
是Taco
的实例,但其超类是Class
。实例关系和超类关系是两个完全不同的东西。
例如:假设您创建了一个带有子类Object
的类Animal
。 Dog
将为您提供一个Animal.new
的实例对象。 Animal
类不 Dog
的实例(它本身不是动物 - 相反,它定义了一种动物)。它的超类是Animal
。
每个对象都是某个类的实例 - 调用Animal
来找出哪一个。但并非所有对象都有超类 - 只有class
的实例。
此外,Class
不会从Class
继承。那是不可能的。 所有类出现在他们自己的Class
的开头,但这并不意味着他们继承自己。这就是ancestors
方法的工作原理。