我正在玩 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)。
另一方面,在退出并重新运行 irb 之后,给定字符串的 object_id 永远不会相同。
这对我提出了几个问题:
object_id
是否存在确定某些 s的已知方案?其他的基本都是随机的吗?- true、false 和 nil 的 id 不是连续的。有没有办法询问给定 id 代表什么对象?(我很好奇其他个位数和 ID 与什么相关联。)
- 你能(不是你应该)编写混淆的 Ruby,在其中使用已知的对象 ID 来引用对象而不命名它们,比如“id 201 的对象 + id 19 的对象”表示“100 + 9”?
更新
使用 Andrew Grimm 的建议,我尝试发现其他“低 id”对象,但发现:
- 在这个序列中似乎没有更多的偶数对象 - id 6、8、10 等不指向任何东西。
- 正如我之前的实验所暗示的,所有奇数编号的 id 都属于数字。具体来说,id 1 指向数字 0,3 指向 1,5 指向 2,以此类推。