加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 04:14:57 所属栏目:百科 来源:网络整理
导读:这是一个我无法解释的有趣案例.看起来私人制定者是“私人的”,但有时也有例外.常规私有方法似乎与私有setter的行为不同: class TestClass def do self.foo = :bar # fine self.baz # error end private def foo=(other) @foo = other end def baz endendTes
这是一个我无法解释的有趣案例.看起来私人制定者是“私人的”,但有时也有例外.常规私有方法似乎与私有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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读