Из приведенного ниже кода представляется, что оператор ||=
оценивается вне класса.
class Foo
attr_reader :bar
def baz
self.bar ||= 'baz'
end
private
attr_writer :bar
end
puts Foo.new.baz
# => in `baz': private method `bar=' called for #<Foo:0x007fd9720829a8> (NoMethodError)
Цитата из принятого ответа на Официальное расширение оператора || = оператора условного присваивания:
In other words, the expansion c = c || 3 is (excluding bugs like in pre-1.9) correct.
Переписывание метода baz
как self.bar = self.bar || 'baz'
не вызывает ошибки.
Я ищу окончательный ответ о том, как и почему Ruby ведет себя таким образом, поскольку он кажется противоречащим интуиции.
Такое поведение присутствует в Ruby версии 1.9.3, 2.0.0 и 2.1.2, что заставляет меня думать, что это не ошибка.