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)