首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Ruby对于真、假和零的object_ids在Windows和Ubuntu中似乎有所不同?

为什么Ruby对于真、假和零的object_ids在Windows和Ubuntu中似乎有所不同?
EN

Stack Overflow用户
提问于 2017-03-01 04:03:25
回答 1查看 175关注 0票数 2

在运行Ruby 2.3.3的Windows 10系统中,irb告诉我:

代码语言:javascript
运行
复制
false.object_id
=> 0
true.object_id
=> 2
nil.object_id
=> 4

但是在c9.io上,在运行Ruby2.3.0的Ubuntu14.04.3中,irb告诉我:

代码语言:javascript
运行
复制
false.object_id
=> 0
true.object_id
=> 20
nil.object_id
=> 8

这并不重要(谁知道呢?),但为什么这些数字是不同的?

注意:这与this one的问题不完全相同。它们都是Ruby 2.3。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-01 08:53:44

正如the accepted answerquestion 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优化Integer的特定方式,小整数的对象ID始终是2n+1,但这只适用于小整数(“小”的定义取决于您是运行64位版本还是32位版本的YARV),而且它只是在没有通知的情况下随时更改的实现细节)。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42522964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档