从下面的代码中可以看出,||=
运算符正在从类外部进行评估。
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)
引用Official expansion of ||= conditional assignment operator上接受的答案:
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上,这让我相信这不是一个错误。
答案 0 :(得分:6)
看起来像bug。
更新:行李箱中的bug为fixed,且为slated for back porting to 2.1 and 2.0。
请注意,问题比这更常见,所有缩写作业都被打破,而不只是条件缩写作业:
private def foo=(*) end
public def foo; 0 end
self.foo = 42
self.foo += 42
# private method `foo=' called for main:Object (NoMethodError)
private :foo
self.foo += 42
# private method `foo' called for main:Object (NoMethodError)