ruby – 为什么私有setter的行为与其他私有方法不同?

前端之家收集整理的这篇文章主要介绍了ruby – 为什么私有setter的行为与其他私有方法不同?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是一个我无法解释的有趣案例.看起来私人制定者是“私人的”,但有时也有例外.常规私有方法似乎与私有setter的行为不同:
class TestClass
  def do
    self.foo = :bar # fine
    self.baz        # error
  end

  private

  def foo=(other)
    @foo = other
  end

  def baz
  end
end

TestClass.new.do

上面的代码设置@foo就好了,尽管被调用了一个明确的自我.然后它没有调用#baz,因为#baz是一个私有方法.

怎么了?

解决方法

私人制定者是特殊的,因为否则他们根本无法被召唤:
foo = :bar

分配给局部变量foo,它不发送消息foo =.

请注意,如果没有显式接收器,setter不是唯一无法调用的东西. @,– @,!,〜,[],[] =,–,*,/,%,&,|,^,**,<<,>>,==,== =,=〜,!〜,!=,<,>,< =,> =,< =>而且如果没有明确的接收者,我可能也忘记了其他一些其他人.然后有像=,<< =等等的东西. 所有这些都需要例外.不幸的是,其中一些只有例外. 有人建议改变私人规则

Can only be called without an explicit receiver,except for [this long list of exceptions which is really complicated,and still not complete].

Can only be called without an explicit receiver or the literal special variable self as receiver.

它保留了定义的所有当前属性(最重要的是它可以在分析时静态确定).

But so far,nothing has come of it.

猜你在找的Ruby相关文章