Почему в Ruby inspect () выводит какой-то идентификатор объекта, который отличается от того, что дает object_id ()?

Все приведенные выше ответы верны, но вы потеряли настройки конфигурации.

Но если ваши темы или шрифты вашей среды IDE изменены или некоторые проблемы, связанные с пользовательским интерфейсом, и вы хотите восстановить тему по умолчанию, просто удалите

$ {user.home} /. IntelliJIdea13 / config / options / options.xml

файл, в то время как IDE не запущен, затем после следующей перезагрузки темы IDE будет сброшен до значения по умолчанию.

30
задан 太極者無極而生 25 May 2014 в 05:11
поделиться

2 ответа

Реализация по умолчанию inspect вызывает реализацию по умолчанию to_s, которая просто показывает шестнадцатеричное значение объекта напрямую, как показано в Object#to_s docs (нажмите на описание метода, чтобы открыть источник).

Тем временем комментарии в исходном тексте на C, лежащие в основе реализации object_id, показывают, что существуют различные "пространства имен" для значений Ruby и идентификаторов объектов в зависимости от типа объекта (например, младший бит кажется нулевым для всех, кроме Fixnums). Вы можете увидеть это в Object#object_id docs (нажмите, чтобы раскрыть источник).

Оттуда видно, что в "пространстве id объектов" (возвращаемом object_id) идентификаторы объектов начинаются со второго бита справа (при этом первый бит равен нулю), но в "пространстве значений" (используемом inspect) они начинаются с третьего бита справа (при этом первые два бита равны нулю). Поэтому, чтобы преобразовать значения из "пространства идентификаторов объектов" в "пространство значений", мы можем сдвинуть object_id влево на один бит и получить тот же результат, который показывает inspect:

> '%x' % (36971870 << 1)
=> "4684abc"

> a = Foo.new
=> #<Foo:0x5cfe4>
> '%x' % (a.object_id << 1)
=> "5cfe4"
49
ответ дан 27 November 2019 в 23:58
поделиться
0x234255E

=>36971870

Это не разница, это шестнадцатеричное представление адреса памяти:-)

1
ответ дан 27 November 2019 в 23:58
поделиться