Я играю с Ruby .object_id
и заметил, что в нескольких последовательных сеансах irb я получаю эти одинаковые результаты:
false.object_id // 0
true.object_id // 2
nil.object_id // 4
100.object_id // 201
Фактически, каждый целочисленный object_id представляется ((значение * 2) + 1).
С другой стороны, данная строка object_id никогда не будет прежней после выхода и повторного запуска irb.
Это вызывает несколько вопросов для меня:
- Существует ли известная схема, в которой определены определенные
object_id
? Другие в основном случайны? - Иды для true, false и nil не являются последовательными. Есть ли способ спросить, какой объект представлен данным идентификатором? (Мне любопытно, к чему привязаны другие одиночные цифры и идентификаторы.)
- Не могли бы вы (не то, чтобы вы должны) писать обфускацию Ruby, где вы используете известные идентификаторы объектов, чтобы ссылаться на объекты, не называя их, например, "объект id 201 + object of id 19" означает "100 + 9"?
Update
Используя предложение Andrew Grimm, я попытался открыть другие объекты с низким идентификатором, но обнаружил, что:
- В этой последовательности больше нет четных объектов - идентификаторы 6, 8, 10 и т.д. не указывают ни на что.
- Как явствует из моего предыдущего эксперимента, все нечетные иды принадлежат числам. В частности, id 1 указывает на число 0, 3 указывает на 1, 5 точек на 2 и т.д.