我在玩Ruby的.object_id,注意到在irb的几个连续会话中,我得到了这些相同的结果:

false.object_id // 0
true.object_id // 2
nil.object_id // 4
100.object_id // 201

事实上,每个整数的object_id似乎是((value*2)+1).

另一方面,一个给定字符串的object_id在退出并重新运行irb后永远不会相同.

这给我提出了几个问题:

  1. 是否有一个已知的方案来确定特定的object_id?其他人基本上是随机的吗?
  2. true、false和nil的ID不是连续的.有没有办法询问给定id代表的是什么对象?(我很好奇其他的一位数和ID与什么有关.)
  3. 你能(不是说你应该)写一个模糊的Ruby吗?在这里,你可以使用已知的对象id来引用对象而不命名它们,比如"id为201的对象+id为19的对象"来表示"100+9"?

使现代化

根据Andrew Grimm的建议,我试图发现其他"低id"对象,但发现:

  • 在这个序列中似乎没有更多偶数对象——ID6、8、10等没有指向任何东西.
  • 正如我之前的实验所暗示的,所有奇数ID都属于数字.具体来说,ID1指向数字0,3指向1,5指向2,依此类推.

推荐答案

在核磁共振成像中,一个物体的object_id与代表C级物体的VALUE相同.对于大多数类型的对象,这个VALUE是指向内存中存储实际对象数据的位置的指针.显然,这在多次运行时会有所不同,因为它只取决于系统决定在何处分配内存,而不取决于对象本身的任何属性.

然而,出于性能原因,truefalsenilFixnum是专门处理的.对于这些对象,实际上没有在内存中包含对象数据的 struct .对象的所有数据都在VALUE本身中编码.正如您已经计算出的,falsetruenil和任何Fixnum i的值分别是024i*2+1.

这样做的原因是,在MRI运行的任何系统上,024i*2+1都不是堆上对象的有效地址,因此与指向对象数据的指针没有重叠.

Ruby相关问答推荐

生成带有小写字母和数字的唯一随机字符串

如何在 Ruby 中生成一个包含 n 个唯一随机数的列表?

独立于 Rails 使用 HAML 文件中的布局

Ruby 将字符串转换为方法名

在 YAML 变量中包含 jekyll / liquid 模板数据?

RSpec 是否有可能期望在两个表中发生变化?

Ruby 中的 :+ 和 &:+ 是什么?

确定字符串数组是否包含ruby中的某个子字符串

Ruby代码美化,多行拆分长指令

try 学习/理解 Ruby 的 setter 和 getter 方法

Ruby 和您必须使用 OpenSSL 支持重新编译 Ruby 或更改 Gemfile 中的源代码

如何在 ruby​​ rake 中明确地失败任务?

在 Rails 中,如何向 String 类添加新方法?

如何设置方法测试中使用的私有实例变量?

如何在 Ruby 中创建私有类常量

无法将 RVM 安装的 Ruby 与 sudo 一起使用

是否可以使用 Ruby 读取文件的修改日期?

判断 Ruby 中是否存在 URL

在 Ruby 中获取用户主目录的跨平台方法?

查找两个数组的共同点