2009-12-03 2 views
14

Ich habe eine Frage zu den und/& &/= Schlüsselwörtern in Ruby.Operator Vorrang für And/&& in Ruby

Die Ruby-Dokumente sagen, dass der Vorrang für die genannten Schlüsselwörter ist: (1) & &, (2) =, (3) und.

Ich habe diesen Code-Snippet Ich schrieb:

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 

Die Ausgabe lautet:

1) 2 4 [Erwartete]

2) 4 4 [? Warum]

Aus irgendeinem Grund die Verwendung der & & Ursachen beide a und b zu 4 auswerten?

Antwort

23

ich die Frage, die Sie fragen, sind nicht ganz verstehen:

Aus Gründen des Vergleichs ist die erste wie folgt bewertet. Ich meine, Sie haben bereits die Antwort selbst gegeben, vor auch die Frage: && bindet enger als = während and weniger fest bindet als =.

Also, im ersten Fall, der Ausdruck wird wie folgt bewertet:

(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 

Im zweiten Fall ist die Bewertung wie folgt:

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 
2

Von Programming Ruby 1.9:

Der einzige Unterschied in den beiden Formen ist Vorrang (and bindet niedriger als &&).

-6

, wenn Sie Ihren Code wie folgt ändern werden Sie bekommen, was Sie

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

21

Der Grund ist einfach erwarten: Vorrang. Wie Sie sagen, ist die Reihenfolge:

  1. & &
  2. =
  3. und

Seit && hat Vorrang vor = wird die Anweisung wie folgt bewertet:

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

Was ergibt:

if a = (2 && 4) then 

Wenn x und y ganze Zahlen sind, x && y kehrt y. So ergibt sich 2 && 4a = 4.

if (a = f(2)) and (b = f(4)) then 
+0

Was ich in Ihrem Beispiel nicht verstehe ist, warum es nicht wie folgt bewertet würde: 'wenn a = (f (2) && b) = f (4) dann " – nus

0

Ich weiß nicht, die spezifischen Regeln Das kann in dieser Situation helfen, aber lassen Sie uns die Prioritäten der Operationen verwenden. die Regeln der Prioritäten verwenden, können wir teilen die Berechnung des zweiten Ausdrucks auf mehrere Schritte

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

offensichtlich, dass in Schritt 2 wir eine falsche Situation zu bekommen - auf der linken Seite = ist rvalue - temporäres Objekt, das kann nicht durch irgendeinen Wert zugewiesen werden. Ich gehe davon aus, dass syntaktische Analysatoren die Regeln der Prioritätsbewertung von Ausdrücken durchbrechen, wenn sie auf solche Situationen stoßen. Weitere Details zu den Berechnungen von Ausdrücken finden Sie unter here