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

Why do Ruby object_ids for true, false, and nil seem to differ in Windows vs. Ubuntu?

在我的Windows10系统运行Ruby2.3.3,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.

正如 the accepted answer on the question you linked to 所说,0、20 和 8 是在 YARV 上使用 flonum 时使用的对象 ID。

所以,很明显,您的 Windows 实现没有使用 flonum。最可能的原因是您没有使用 YARV(例如使用 JRuby 或 Rubinius),或者您 使用 YARV,但使用的是 32 位版本。

注意:对象 ID 是特定 Ruby 实现的私有内部实现细节。您使用的 Ruby 版本完全无关。相关的是您使用的是哪个实现、哪个版本、哪个命令行选项、您如何编译它、您的环境是什么等等。与语言无关。

另请注意:永远不要依赖对象 ID 的特定值。对象 ID 保证两件事,而且只有这两件事:

  1. 对象在其生命周期内不会更改其对象 ID。
  2. 没有两个对象同时具有相同的对象 ID。

以下是一些保证的内容:

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