我正在玩一些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?有趣的是,如果
,它会返回NilClass1.9.3-p392 :017 > class Mx; end.class
=> NilClass
答案 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
,它是一个对应于当前对象的特殊伪变量,并且是一个类定义,它是类对象本身。 (请记住,类就像任何其他对象一样是对象。)