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
我想了解原因:
对 (self % i)
的调用不需要 self
和 %
之间的 space,我猜它有一些东西如何处理运算符优先级?
为什么,在 %(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 能够成功解析它,这就是它被允许的原因。
研究一些代码示例并发现此片段,为简洁起见在此处编辑:
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
我想了解原因:
对
(self % i)
的调用不需要self
和%
之间的 space,我猜它有一些东西如何处理运算符优先级?为什么,在
%(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 能够成功解析它,这就是它被允许的原因。