“Foo”和“Foo.class”有什么区别?

时间:2013-03-19 05:28:41

标签: ruby

这些不应该相同吗?

p String.ancestors
p String.class.ancestors

相反,我得到:

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:7)

TL; DR

  

这些不应该相同吗?

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

完整答案

FooFoo.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 )。在某些语言中,这些是两个完全独立的非交叉层次结构。您不要混合对象及其类。这就像混合甜蜜和方形的东西。

答案 1 :(得分:1)

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

String.ancestors
String.class.ancestors

你应该比较一下:

String
String.class

这些相当于:

String
Class

因为StringClass的实例。由于StringClass不同,因此ancestors没有理由相同。