Реализация по умолчанию inspect
вызывает реализацию по умолчанию to_s
, которая просто показывает шестнадцатеричное значение объекта напрямую, как показано в Object#to_s
документах (нажмите на описание метода раскрыть источник).
Между тем комментарии в источнике C, лежащие в основе реализации object_id
, показывают, что существуют разные «пространства имен» для значений Ruby и идентификаторов объектов, в зависимости от типа объекта (например, младший бит кажется нулевым для всех но Fixnums). Вы можете видеть это в Object#object_id
документах (нажмите, чтобы открыть источник).
Оттуда мы можем видеть, что в «пространстве идентификаторов объектов» (возвращаемом object_id
) идентификаторы объектов начинаются со второго бита справа (первый бит равен нулю), но в «пространстве значений» (используется inspect
) они начинаются с третьего бита справа (первые два бита равны нулю). Таким образом, чтобы преобразовать значения из «пространства идентификаторов объектов» в «пространство значений», мы можем сдвинуть object_id
влево на один бит и получить тот же результат, который показан как inspect
:
> '%x' % (36971870 << 1)
=> "4684abc"
> a = Foo.new
=> #<Foo:0x5cfe4>
> '%x' % (a.object_id << 1)
=> "5cfe4"