这些不应该是一样的吗?
p String.ancestors
p String.class.ancestors
相反,我得到:
[String, Comparable, Object, Kernel, BasicObject]
[Class, Module, Object, Kernel, BasicObject]
谢谢你的帮助。
这些不应该是一样的吗?
p String.ancestors
p String.class.ancestors
相反,我得到:
[String, Comparable, Object, Kernel, BasicObject]
[Class, Module, Object, Kernel, BasicObject]
谢谢你的帮助。
这些不应该是一样的吗?
不,他们不应该,为什么?
和之间的区别与和Foo
之间Foo.class
相同f
f.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)。在某些语言中,这是两个完全独立的不相交的层次结构。你不要混合对象和它们的类。这就像混合甜蜜和方形的东西。
您的问题未经过优化以进行最小比较。而不是比较:
String.ancestors
String.class.ancestors
你应该比较:
String
String.class
这些等价于:
String
Class
因为String
是 的一个实例Class
。并且由于String
和Class
是不同的,因此没有理由它们ancestors
应该相同。