Ruby条件赋值和私有方法

从下面的代码中可以看出, ||=运算符是从类外部进行评估的。

 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 # (NoMethodError) 

引用关于官方扩展的接受答案|| =条件赋值运算符 :

 In other words, the expansion c = c || 3 is (excluding bugs like in pre-1.9) correct. 

baz方法重写为self.bar = self.bar || 'baz' self.bar = self.bar || 'baz'不会引起错误。

我正在寻找关于Ruby 如何以及为什么以这种方式表现的明确答案,因为它看起来反直觉。

这种行为出现在Ruby版本1.9.3,2.0.0和2.1.2上,这让我相信这不是一个bug。

这看起来像个bug 。

更新:该错误已在主干中修复 ,并预定后端移植到2.1和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)