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 #<Foo:0x007fd9720829a8> (NoMethodError)

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

解决方法

看起来像一个 bug.

更新:bug在中继线是fixed,是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)

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...