2016-01-07 10 views
6

Ich kann nicht Vorrang von Ruby Operatoren in einem folgenden Beispiel verstehen:Verständnis Vorrang der Zuweisung und logischer Operatoren in Ruby

x = 1 && y = 2 

Da && höhere Priorität hat als =, mein Verständnis ist, dass ähnlich wie + und * Betreiber:

1 + 2 * 3 + 4 

die als

1 + (2 * 3) + 4 
aufgelöst wird

x = (1 && y) = 2 

jedoch alle Ruby-Quellen (einschließlich interner Syntaxparser Ripper) analysieren dies als

x = (1 && (y = 2)) 

Warum:

es sollte gleich sein?


EDIT [2016.08.01]

Fokus Lassen Sie uns auf einem subexpression: 1 && y = 2

Nach Vorrangregeln, sollten wir versuchen, es so zu analysieren:

(1 && y) = 2 

was macht keinen Sinn, weil = eine bestimmte LHS (Variable erfordert, konstant, [] Array-Artikel usw.). Aber da (1 && y) ist ein korrekter Ausdruck, wie soll den Parser mit ihr umgehen?

Ich habe versucht, mit Rubys parse.y Beratung, aber es ist so Spaghetti-ähnlich, dass ich bestimmte Regeln für die Zuordnung nicht verstehen kann.

+0

Schöne Frage, es gibt einige Vorteile in der Argumentation. –

Antwort

2

Einfach. Ruby interpretiert es nur so, dass es Sinn ergibt. = ist Zuweisung. In Ihrer Erwartung:

x = (1 && y) = 2 

es macht keinen Sinn, etwas zu 1 && y zuzuweisen. Sie können einer Variablen oder einer Konstante nur etwas zuweisen.

Und beachten Sie, dass der Zweck der Vorrangregel ist eine ansonsten nicht eindeutig Ausdruck eindeutig zu machen. Wenn eine Möglichkeit, es zu interpretieren ist nicht sinnvoll, dann gibt es keine Notwendigkeit für Begriffsklärung, und daher würde die Vorrangregel nicht wirksam.

+2

Parser verwendet Regeln, es hat keine Intelligenz, um zu unterscheiden, was sinnvoll ist und was nicht, also ist Ihre Antwort nicht informativ. –

+0

@ RustamA.Gasanov Die Überprüfung, ob die linke Seite der Zuweisung eine Variable oder eine Konstante ist, erfordert keine Intelligenz. Dies kann ohne Ausführung des Codes erfolgen. – sawa

+0

Ich versuche tatsächlich, einen Ruby-Parser zu schreiben, um Ruby-Interna besser kennenzulernen. Und deine Antwort hilft nicht wirklich. 'x = 1 && y' (gleich' x = (1 && y) ') ist ein schöner Ausdruck für sich, den der Parser nach allgemeinen Grammatikregeln gerne akzeptiert. Daher suche ich nach einem bestimmten Mechanismus in der Ruby-Grammatik, um in diesem Fall zuerst "y = 2" zu analysieren. – Michael

0

Mein Verständnis ist, dass im Fall von

x = 1 && y = 2 

Die logischen UND ist zuerst analysiert. Das UND ist dann gezwungen, seine linke Seite und seine rechte Seite zu bewerten. In der Auswertung erfolgt die linke Seite der ersten Zuweisung und dann in der Auswertung der rechten Seite die zweite. Es ist aus diesem Grunde, dass im Fall von:

x = false && y = 2 

„y“ wird nie zugewiesen werden.Das AND wird getroffen, wodurch die x-Zuweisung zur Auswertung gezwungen wird, aber die Ausführung der y-Zuweisung nie ausgeführt wird, da es für das AND nicht notwendig ist, seinen Zweck zu erfüllen. Der Parser ist also, wiederum einfach nach meinem Verständnis, schlau genug, um zu erkennen, dass beim Laufen des UND die Gleichung in eine linke und rechte Seite (Gleichungen) aufgeteilt wird, die ihrerseits nach der Gleichung (1) berechnet werden Reihenfolge der Operation.

+0

'und' Operator verhält sich so, wie Sie es beschreiben. '&&' wird interpretiert als 'x = (1 && (y = 2))'. Ja, wenn "1" durch "falsch"/"nil" ersetzt werden würde, dann würde "y =" Zuweisung überhaupt nicht aufgelöst werden, aber nicht wegen des "x" Wertes, sondern wegen der linken Seite des inneren Ausdrucks ('1 && (y = 2)'). – Michael

Verwandte Themen