从下面的代码中可以看出,||=运营商正在从课外进行评估.
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)
Run Code Online (Sandbox Code Playgroud)
引用关于官方扩展的接受答案|| =条件赋值运算符:
In other words, the expansion c = c || 3 is (excluding bugs like in pre-1.9) correct.
Run Code Online (Sandbox Code Playgroud)
重写baz方法self.bar = self.bar || 'baz'不会引发错误.
我正在寻找关于Ruby 如何以及为什么以这种方式表现的明确答案,因为它似乎违反直觉.
这种行为出现在Ruby版本1.9.3,2.0.0和2.1.2上,这让我相信这不是一个错误.
这看起来像一个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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
214 次 |
| 最近记录: |