【问题标题】:Ruby self, operator precedence and instance method invocationRuby self、运算符优先级和实例方法调用
【发布时间】:2019-04-04 18:36:58
【问题描述】:

通过一些代码示例,发现了这个 sn-p,为简洁起见在此处编辑:

  class Year
    attr_reader :number

    def initialize(number)
      @number = number
    end

   def a(str)
     puts str
   end

   def %(other)
     number % other # why number instead of @number
   end

   def my_func()
     (self a "hello") # error
   end

   private

   def divisible_by?(i)
     (self % i) == 0 #Operator precedence binding self and % together?
   end
end

我正在寻找原因:

  1. (self % i) 的调用不需要self% 之间有空格,我猜它与运算符优先级有关?

  2. 为什么,在%(other) 的方法定义中,该方法引用number,我原以为它必须引用实例变量@number

任何帮助和/或链接到可以帮助我解释这一点的 ruby​​ 文档将不胜感激。提前联系

【问题讨论】:

  • 请在不同的线程中写不同的问题。

标签: ruby self operator-precedence


【解决方案1】:

为什么是number 而不是@number

因为你已经定义了一个 reader/getter,不妨使用它。今天方法number 由实例变量支持,明天它被计算(或延迟实例化等)。通过使用方法而不是其内部,您可以保护自己免受级联更改的影响。它被称为“封装”。但是您可以使用该变量,但这不是一个好习惯。

对 (self % i) 的调用不需要 self 和 % 之间的空格,我猜它与运算符优先级有关?

没有。与优先级无关。无空间形式没有歧义,ruby 能够成功解析它,这就是它被允许的原因。

【讨论】:

  • 非常感谢您,读者的精彩之处,忘记了。我仍然在为为什么 (self % i) 有效但 (self a "hello") 无效 - 这就是为什么我认为它与运算符优先级有关。
  • @ngriffin:那是因为% 是一个有效的运算符(因此可以使用运算符语法)而a 不是。
猜你喜欢
  • 1970-01-01
  • 2020-08-19
  • 2011-06-21
  • 2020-03-05
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
  • 2011-10-14
  • 2021-03-29
相关资源
最近更新 更多