为什么Ruby object_ids对于true,false和nil似乎在Windows与Ubuntu中有所不同?

时间:2017-03-01 04:03:26

标签: ruby objectid

在运行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。

1 个答案:

答案 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保证两件事,只有这两件事:

  1. 对象在其生命周期内不会更改其对象ID。
  2. 没有两个对象同时具有相同的对象ID。
  3. 以下是保证的一些内容:

    • 无法保证在程序的不同运行期间对象具有相同的对象ID。
    • 无法保证对象ID在程序运行期间是唯一的,只要这些对象不同时存在,它就可以重复用于不同的对象。
    • 无法保证对象ID将遵循某种模式,例如它始终是对象的内存地址(例如,在JRuby上不是真的),或者它总是一个特定的值(对于nilfalse不正确,正如您刚刚发现的那样),或者它总是以某种方式与对象的值相关(由于YARV优化Integer的特定方式,小整数的对象ID将始终为2n + 1,但这仅适用于小整数(其中“small”的定义取决于您是运行64位还是32位版本的YARV)并且它只是一个可能随时更改的实现细节,恕不另行通知。)