最近我开始学习Ruby,我正在试验Ruby如何在单个对象上调用方法。但是,下面的代码片让我很难,因为我没有意识到它是如何实际工作的
a = 4
b = -3
c = 2
puts a*b-c # operator precedence preserved
puts a . * b . - c # operator precedence not preserved
puts a.send(:*, b).send(:-, c) # operator precedence preserved
puts a-b*c # operator precedence preserved
puts a . - b . * c # operator precedence preserved
puts a.send(:-, b).send(:*, c) # operator precedence not preserved
输出:
-14
-20
-14
10
10
14
任何人都可以解释运营商优先权如何在这里工作吗?我假设每个部分中的所有三种语法都应该反映相同的含义。如果已经提出或解释过这个问题,我先道歉。
答案 0 :(得分:5)
运算符优先级仅在使用运算符时适用。所有这些例子:
puts a . * b . - c # operator precedence not preserved
puts a.send(:*, b).send(:-, c) # operator precedence preserved
puts a . - b . * c # operator precedence preserved
puts a.send(:-, b).send(:*, c) # operator precedence not preserved
是直接方法调用,与相应的运算符相比,恰好是错误的顺序或正确的顺序。
也许括号使它更清晰?
puts a.*(b.-(c)) # .- called first, .* with the return value of .-
puts a.send(:*, b).send(:-, c) # .* called first, .- with the return value of .*
puts a.-(b.*(c)) # .* called first, .- with the return value of .*
puts a.send(:-, b).send(:*, c) # .- called first, .* with the return value of .-
答案 1 :(得分:0)
只有示例1和4遵循算术运算符优先级,因为只有示例1和4将运算符称为运算符。
示例3和6都调用send
方法,因此它们的行为与任何其他方法调用一样。它们从左到右,就像你在一组数据上写一个复杂的单行时所发生的那样,如下所示:
somearray.select{|x| somecondition(x)}.map{|x| somefunction(x)}.each{|x| puts x}
唯一令人困惑的是示例2和5.这些诀窍是,如果删除句点周围的空格,您可以了解发生了什么。然后你得到:
puts a.* b.- c
puts a.- b.* c
现在,显而易见的是,首先在b上进行方法调用,应用一些以c为参数的运算符。这会返回一些结果。该结果用作a上的运算符调用的参数。结果是给出了看跌期权。换句话说,这些行从右到左进行评估,语句等同于
puts(a.*(b.-(c)))
puts(a.-(b.*(c)))