【问题标题】:When using a private attr_accessor, why does self.attribute= work, but self.attribute doesn't?使用私有 attr_accessor 时,为什么 self.attribute= 有效,而 self.attribute 无效?
【发布时间】:2018-01-23 21:28:09
【问题描述】:

假设我有一个类,我像这样定义attr_accessor

private

attr_accessor :attribute

我明白为什么使用 self.attribute 读取器方法不起作用 - 在 Ruby 中,您不能在显式接收器上调用私有方法。

我感到困惑的是,为什么这条规则不适用于作者?为什么我可以调用self.attribute = 1,并且不会抛出任何访问冲突错误?

【问题讨论】:

  • 如果不做任何研究,我猜这是因为需要 self. 来消除分配局部变量的歧义。
  • 是的,我在想它必须这样做。我想我想知道它是否是一种特殊情况来防止这样的模棱两可的调用,或者我不理解的对象模型是否允许它。
  • 这不是指定样本的复制品。 OP 了解您不能使用 self.attribute 调用私有方法,例如 attribute。问题是为什么他可以使用self.attribute = 调用私有mutator。这确实令人惊讶,也是一个很好的问题。

标签: ruby


【解决方案1】:

根据@Jörg W Mittag 对 Alan Skorkin 的博客条目 Ruby Access Control – Are Private And Protected Methods Only A Guideline? 的评论:

快速说明:有一种特殊情况,允许使用显式接收器调用私有方法:

如果方法名称以 '=' 结尾(即它是一个属性写入器)并且显式接收器是 'self',那么这是有效的。这是必要的,因为由于方法/变量的歧义,只能使用显式接收器调用 setter。否则无法调用私有 setter。

Jörg 没有引用任何消息来源,但他非常可靠。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-09
    • 2011-07-05
    • 2012-01-15
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多