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

Joa*_*mal 3 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
Run Code Online (Sandbox Code Playgroud)

输出:

-14
-20    
-14
10
10
14
Run Code Online (Sandbox Code Playgroud)

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

Ry-*_*Ry- 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
Run Code Online (Sandbox Code Playgroud)

是直接方法调用,与其相应的运算符相比,恰好是错误的顺序或正确的顺序.

也许括号使它更清楚?

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 .-
Run Code Online (Sandbox Code Playgroud)