1,2:
主要是为了性能。因为在 ruby 中,整数也是对象,但整数使用多,性能这关不好过。所以就特殊处理,如果是 32 位系统,高位为符号位,后 30-1 位为实际数值,0 位为标志,设为 1,这样保证了其 VALUE 为奇数,不会与 malloc 出来的指针重合。这样 30 位内的整数就速度很快了。
转换关系是这样
数字,object_id >> 1 比如 3 就是 1,5 就是 2
false,true,nil 这些因为奇数被占了,就只好用偶数了,malloc 也不会出现这些值,所以也不会与 VALUE 重合。
3:能占的都被占了,字母也分不到了,再说这个属于 String 范围了。
4:object id 一样就是同一对象。