1

这些不应该是一样的吗?

p String.ancestors
p String.class.ancestors

相反,我得到:

[String, Comparable, Object, Kernel, BasicObject]
[Class, Module, Object, Kernel, BasicObject]

谢谢你的帮助。

4

2 回答 2

7

TL;博士

这些不应该是一样的吗?

不,他们不应该,为什么?

完整答案

和之间的区别与和Foo之间Foo.class相同ff.class

class Foo; end

f = Foo.new

f # => #<Foo:0x007ff289849170>
f.class # => Foo

Foo # => Foo
Foo.class # => Class

Foo是一个对象,Foo.class是它的类。

如您所见,类和类分叉的层次结构位于Object. 因为 ruby​​ 中的所有东西都是一个对象(除了块:))。但不一定非要这样,这只是 Matz 的设计决定(我猜是 Matz)。在某些语言中,这是两个完全独立的不相交的层次结构。你不要混合对象和它们的类。这就像混合甜蜜和方形的东西。

于 2013-03-19T05:31:37.290 回答
1

您的问题未经过优化以进行最小比较。而不是比较:

String.ancestors
String.class.ancestors

你应该比较:

String
String.class

这些等价于:

String
Class

因为String是 的一个实例Class。并且由于StringClass是不同的,因此没有理由它们ancestors应该相同。

于 2013-03-19T08:23:20.287 回答