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.

相关文章

以下代码导致我的问题: class Foo def initialize(n=0) @n = n end attr_accessor :n d...
这是我的spec文件,当为上下文添加测试“而不是可单独更新用户余额”时,我得到以下错误. require 's...
我有一个拦截器:DevelopmentMailInterceptor和一个启动拦截器的inititializer setup_mail.rb. 但我想将...
例如,如果我有YAML文件 en: questions: new: 'New Question' other: recent: ...
我听说在RSpec中避免它,let,let !,指定,之前和主题是最佳做法. 关于让,让!之前,如果不使用这些,我该如...
我在Rails中使用MongoDB和mongo_mapper gem,项目足够大.有什么办法可以将数据从Mongoid迁移到 Postgres...