1

我正在玩一些 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 
4

3 回答 3

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_idnil。在您的解释器中,您可以执行nil.object_id. 顺便说一句,对象 ID 是特定于实现的,您不能依赖nil.object_id == 4.

于 2013-04-24T16:22:52.393 回答
2

class Mx; end返回nil,所以这就是你观察到的。

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

于 2013-04-24T16:19:27.967 回答
1

类定义表达式计算为类定义中最后一个表达式的值。在第二种情况下,类定义中没有任何内容,因此类定义评估为 Ruby 的虚无表示,即nil.

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

于 2013-04-24T16:55:36.140 回答