Краткая версия: Метод по умолчанию inspect
метод для класса отображает адрес объекта. * Как это сделать в собственном inspect
методе?Адрес объекта в Ruby
* (Чтобы было ясно, я хочу 8-значный шестнадцатеричный номер, который вы обычно получаете от inspect
. Я не забочусь о фактическом адресе памяти. Я просто назвав его адрес в памяти, потому что она выглядит . как один я знаю, что Руби является память безопасной)
Длинная версия:. у меня есть два класса, Thing
и ThingList
. ThingList
является подклассом Array
, специально разработанным для хранения вещей. Из-за природы Вещей и способа их использования в моей программе Вещи имеют переменную экземпляра @container
, которая указывает на ThingList
, который содержит Thing
.
Возможно, что две вещи имеют точно такие же данные. Поэтому, когда я отлаживаю приложение, единственный способ, которым я могу надежно различать две вещи, - использовать inspect
, который отображает их адрес. Однако, когда я inspect
a Thing
, я получаю страницы на страницах вывода, потому что inspect
будет рекурсивно проверять @container
, в результате чего каждую вещь в списке также проверят!
Все, что мне нужно, это первая часть этого вывода. Как я могу написать собственный метод inspect
на Thing
, который просто отобразит это?
#<Thing:0xb7727704>
EDIT: Я просто понял, что по умолчанию to_s
делает именно это. Раньше я этого не замечал, потому что у меня есть пользовательский to_s
, который предоставляет удобные для пользователя сведения об объекте.
Предположим, что я не могу использовать to_s
, и что я должен написать обычай inspect
.
Строго говоря, я не думаю, что [object_id] (http://ruby-doc.org/core/classes/Object.html#M000339) возвращает адрес объекта, но уникальный идентификатор должен решить проблему OP , – maerics
@maerics: В MRI это определенно делает (для всех объектов кроме целых, символов, true, false и nil). – sepp2k
Хм, возможно, на некоторых версиях; мой ближайший MRI (1.8.7 darwin) определенно показывает разные значения между стандартными 'inspect' и' object_id'. – maerics