В Ruby foo.inspect может распечатать все переменные экземпляра - можем ли мы распечатать отдельную переменную, если нет метода доступа? - PullRequest
4 голосов
/ 22 марта 2011

Часто мы можем использовать p foo или foo.inspect, чтобы увидеть переменные экземпляра, но это только поведение по умолчанию, и объект может выбрать отображение чего-то другого (или скрыть все переменные экземпляра) (возможно, путем повторного определения метод inspect).

Основной вопрос, если я вижу для foo.inspect, что @bar является объектом, имеющим экземплярную переменную @wah, которая имеет значение "hello", могу ли я распечатать @wah напрямую , если нет доступа (читателя) для @bar и @wah? Обычно он не должен быть читаемым, если нет средства доступа, но что, если для целей отладки?

Ответы [ 2 ]

6 голосов
/ 22 марта 2011

В Ruby вся защита доступа может быть обойдена с помощью отражения:

@bar.instance_variable_get(:@wah)
1 голос
/ 22 марта 2011

Попытка напечатать переменную, определенную attr_writer, из-за пределов класса выдает ошибку (undefined method 'wah' for #<Bar:0x0000...>) - но для целей отладки вы можете использовать instance_variable_get как таковой:

b = Bar.new(:wah => "Hello")
b.wah # undefined method

b.instance_variable_get("@wah") # => "Hello"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...