什么在类定义上调用object_id呢?

时间:2013-04-24 16:15:26

标签: ruby

我正在玩一些ruby代码,并做了类似的事情:

1.9.3-p392 :012 > class Mx; self; end.object_id
 => 70263149976460 
1.9.3-p392 :013 > class Mx; end.object_id
 => 4 

我认为第一个例子是在执行代码时返回对该类的实际引用,但在第二个示例中发生了什么?什么是4?有趣的是,如果

,它会返回NilClass
1.9.3-p392 :017 > class Mx; end.class
 => NilClass 

3 个答案:

答案 0 :(得分:3)

类定义是一个表达式。所有表达式都计算为一个值。为:

class Foo; end该值为nil

在类定义(和其他块)ruby中 返回块中最后一个表达式的值。如果块为空,则返回的值为nil。

class Foo; "BLAH"; end # => "BLAH"

此处self是对class Foo引入的类的引用。

class Foo; self; end # => Foo

nil是单身“对象”,其.class => NilClass

“4”是.object_id的{​​{1}}。在您的口译员中,您可以nil。 BTW对象ID是特定于实现的,您不能依赖nil.object_id

答案 1 :(得分:2)

class Mx; end会返回nil,这就是您所观察到的内容。

相反,class Mx; self; end会返回类Mx本身。

答案 2 :(得分:1)

类定义表达式求值为类定义中最后一个表达式的值。在第二种情况下,类定义中没有 nothing ,因此类定义评估为Ruby的虚无表示,即nil

在第一种情况下,类定义中的最后一个(也是唯一的)表达式是self,它是一个对应于当前对象的特殊伪变量,并且是一个类定义,它是类对象本身。 (请记住,类就像任何其他对象一样是对象。)