最近我开始学习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)
谁能够解释运营商优先权如何在这里工作?我假设每个部分中的所有三种语法都应该反映相同的含义.如果已经提出或解释过这个问题,我先道歉.
运算符优先级仅在使用运算符时适用.所有这些例子:
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)