3

ごく最近、私は 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

ここで演算子の優先順位がどのように機能するかを説明できる人はいますか? 各部分の 3 つの構文はすべて同じ意味を反映していると想定しました。この質問がすでに尋ねられているか、説明されている場合は、まずお詫び申し上げます。

4

2 に答える 2

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 .-
于 2012-08-07T02:53:27.340 に答える
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を引数として取る演算子を適用することは明らかです。これはいくつかの結果を返します。その結果は、のオペレーター呼び出しの引数として使用されます。その結果はプットに与えられます。言い換えれば、これらの行は右から左に評価され、ステートメントは次のようになります。

puts(a.*(b.-(c)))
puts(a.-(b.*(c)))
于 2012-08-07T02:51:13.473 に答える