Ruby ruby 中 Fixnum 的 object_id 这样设计的目的是什么?

foxzool · 2015年03月06日 · 最后由 blacktulip 回复于 2015年03月07日 · 1759 次阅读
2.2.0 :038 > false.object_id
 => 0
2.2.0 :039 > true.object_id
 => 20
2.2.0 :040 > 0.object_id
 => 1
2.2.0 :041 > 1.object_id
 => 3
2.2.0 :042 > 2.object_id
 => 5
2.2.0 :043 > 3.object_id
 => 7
2.2.0 :044 > 100.object_id
 => 201

object_id 都是 Fixnum * 2 + 1的增长, 为什么这样设计?

共收到 5 条回复

貌似负数也是这样

[34] pry(main)> -1.object_id
=> -1
[35] pry(main)> -2.object_id
=> -3
[36] pry(main)> -3.object_id
=> -5
[37] pry(main)> -100.object_id
=> -199

#1楼 @ywjno -1 * 2 + 1 = -1;
-201 * 2 + 1 = -401

无责任臆测:为了取 Fixnum 的 object id 效率更高。 效率最高的方法当然是 每个 Fixnum 的 id 就是它自己,但是那样 nil true false 就没地方放了。 无奈之下就只好退而求其次,用 2n+1 来对应。 那位说 2n+1 算起来慢的,实际上呢我们是用二进制位运算的, Fixnum 最后面塞个 1 就是 object id 了

例:25 == 11001 , 11001 最后塞个 1 就是 110011 == 51 ,正好吧


当然具体事实是不是这样我就不清楚了......


Update: 楼下已有原理说明,最后那个位是一直保留着的,所以是不用算可以直接对应上的。

有意思的问题,查了一下,发现以前也有人问过了,https://ruby-china.org/topics/15581

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册