在运行Ruby 2.3.3的Windows 10系统中,irb告诉我:
false.object_id
=> 0
true.object_id
=> 2
nil.object_id
=> 4
但是在c9.io上,在Ubuntu 14.04.3中,运行Ruby 2.3.0,irb告诉我:
false.object_id
=> 0
true.object_id
=> 20
nil.object_id
=> 8
这不重要(谁知道?),但为什么这些数字不同?
注意:这与this one的问题不完全相同。他们都是Ruby 2.3。
答案 0 :(得分:4)
the accepted answer上的question you linked to表示,0,20和8是在YARV上使用flonums时使用的对象ID。
因此,显然,您的Windows实现不使用flonums。最可能的原因是您要么不使用YARV(例如使用JRuby或Rubinius),要么 使用YARV,而使用32位版本。
注意:对象ID是特定Ruby实现的私有内部实现细节。您使用的Ruby版本完全无关紧要。相关的是您正在使用的实现,版本,命令行选项,编译方式,环境等等。它与语言无关。
另请注意:您永远不应该依赖对象ID的特定值。对象ID保证两件事,只有这两件事:
以下是不保证的一些内容:
nil
和false
不正确,正如您刚刚发现的那样),或者它总是以某种方式与对象的值相关(由于YARV优化Integer
的特定方式,小整数的对象ID将始终为2n + 1,但这仅适用于小整数(其中“small”的定义取决于您是运行64位还是32位版本的YARV)并且它只是一个可能随时更改的实现细节,恕不另行通知。)