Ruby条件赋值和私有方法

12

从下面的代码中,看起来||=运算符是在类的外部进行评估的。

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)

引用来自官方扩展的||=条件赋值运算符的答案:

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中都存在,因此我认为这不是一个错误。


self.bar ||= 'baz' 的意思是 self.bar || self.bar = 'baz' - Arup Rakshit
@ArupRakshit 但这仍然没有解释为什么会抛出错误,是吗? - Farrukh Abdulkadyrov
@FarrukhAbdulkadyrov,那不是解释,而是针对误解了语法||=的OP。 - Arup Rakshit
错误已在一个小时前在主干中被修复,并计划回溯到2.1和2.0版本 - Jörg W Mittag
1个回答

6

看起来像是一个漏洞

更新:该漏洞已在主干中修复,并计划将其回溯到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)

是的,这是个bug。我正准备记录它。但在那之前,来这里确实不错... - Arup Rakshit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接