Переменные экземпляра по умолчанию скрыты. Вы можете обойти это, используя instance_variable_get и instance_variable_set, но они являются частными (вы также можете обойти это, если нужно), потому что делать такие вещи однотипно.
В Ruby, когда вы говорите foo.bar
, вы вызываете метод bar
для вашего объекта foo
(без аргументов). Когда вы говорите foo.bar = 5
, вы вызываете метод bar=
с аргументом 5
.
Все, что attr_accessor
делает, это предоставляет вам реализации bar
и bar=
, но это:
class MyClass
attr_accessor :bar
end
эквивалентно
class MyClass
def bar
@bar
end
def bar=(new_bar)
@bar = new_bar
end
end
Это позволит вам позже заменить реализацию чем-то другим, если хотите. Предполагается, что переменные экземпляра являются частными для этого объекта, поэтому я бы не советовал пытаться обойти это, если вы не выполняете метапрограммирование в тяжелых условиях.