Ruby条件赋值和私有方法

时间:2014-06-05 10:59:29

标签: 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)

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

1 个答案:

答案 0 :(得分:6)

看起来像bug

更新:行李箱中的bugfixed,且为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)