14

Ruby の and/&&/= キーワードについて質問があります。

ruby のドキュメントによると、前述のキーワードの優先順位は (1)&&、(2)=、(3)and です。

私が書いたコードのこのスニペットがあります:

def f(n) 
 n
end

if a = f(2) and  b = f(4) then  
    puts "1) #{a} #{b}" 
 end

if a = f(2) &&  b = f(4) then   
    puts "2) #{a} #{b}"     
end

出力は次のとおりです。

1) 2 4 [予想]

2) 4 4 [なぜ?]

何らかの理由で && を使用すると、a と b の両方が 4 に評価されますか?

4

5 に答える 5

24

私はあなたが尋ねている質問をよく理解していません。つまり、質問をする前に、すでに自分で答えを出しているということです。&&=and=

したがって、最初のケースでは、式は次のように評価されます。

( a=f(2) )  and  ( b=f(4) )
( a=  2  )  and  ( b=f(4) )
      2     and  ( b=f(4) ) # a=2
      2     and  ( b=  4  ) # a=2
      2     and        4    # a=2; b=4
                       4    # a=2; b=4

2 番目のケースでは、評価は次のようになります。

a   =   (  f(2) && ( b=f(4) )  )
a   =   (    2  && ( b=f(4) )  )
a   =   (    2  && ( b=  4  )  )
a   =   (    2  &&       4     ) # b=4
a   =                    4       # b=4
                         4       # b=4; a=4
于 2009-12-03T16:15:25.430 に答える
21

理由は簡単です。優先順位です。おっしゃる通り、順番は次のとおりです。

  1. &&
  2. =

&&has は よりも優先されるため=、ステートメントは次のように評価されます。

if a = (f(2) && (b = f(4))) then 

結果は次のとおりです。

if a = (2 && 4) then

xyが整数の場合、 を返しx && yますy。したがって2 && 4、結果は になりa = 4ます。

比較のために、最初のものは次のように評価されます。

if (a = f(2)) and  (b = f(4)) then 
于 2009-12-03T15:51:03.537 に答える
3

Ruby 1.9 のプログラミングから:

2 つの形式の唯一の違いは、優先順位です (andバインドは より低くなり&&ます)。

于 2009-12-03T15:18:06.553 に答える
0

この状況で役立つ具体的なルールはわかりませんが、操作の優先度を使用しましょう。優先順位の規則を使用して、2 番目の式の計算をいくつかのステップに分割できます。

1 f(2) &&  b => expr1
2 expr1 = f(4) => expr2
3 a = expr2

ステップ 2 では、間違った状況が発生することは明らかです。= の左側は右辺値です。一時オブジェクトであり、値を代入することはできません。このような状況に遭遇した場合、構文解析器は式の優先度評価の規則を破ると思います。式の計算の詳細については、こちらを参照してください

于 2009-12-03T17:50:06.213 に答える
-7

このようにコードを変更すると、期待どおりの結果が得られます

def f(n) 
  n
end

if (a = f(2) and  b = f(4)) then  
  puts "1) #{a} #{b}" 
end

if (a = f(2)  and  b = f(4)) then   
  puts "2) #{a} #{b}"         
end

1) 2 4

2) 2 4

于 2009-12-03T15:24:28.587 に答える