Ruby self、运算符优先级和实例方法调用

Ruby self, operator precedence and instance method invocation

研究一些代码示例并发现此片段,为简洁起见在此处编辑:

  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% 之间的 space,我猜它有一些东西如何处理运算符优先级?

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

任何帮助将不胜感激 and/or 指向 ruby 文档的链接可以帮助我解释这一点。提前联系

why number instead of @number

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

the call to (self % i) doesn't require a space between the self and %, I'm guessing it has something to do with operator precedence?

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