通过方法语法调用的运算符方法的优先级

时间:2012-08-07 02:35:16

标签: ruby operators

最近我开始学习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

任何人都可以解释运营商优先权如何在这里工作吗?我假设每个部分中的所有三种语法都应该反映相同的含义。如果已经提出或解释过这个问题,我先道歉。

2 个答案:

答案 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)))