Ruby条件赋值和私有方法

arr*_*hiu 12 ruby memoization

从下面的代码中可以看出,||=运营商正在从课外进行评估.

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上,这让我相信这不是一个错误.

Jör*_*tag 6

这看起来像一个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)