这是一个我无法解释的有趣案例.看起来私人制定者是“私人的”,但有时也有例外.常规私有方法似乎与私有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.
它保留了定义的所有当前属性(最重要的是它可以在分析时静态确定).