2016-01-07 18 views
6

non riesco a capire precedenza degli operatori di Ruby in un seguente esempio:Capire la precedenza di assegnazione e operatore logico in Ruby

x = 1 && y = 2 

Dal && ha precedenza maggiore rispetto =, la mia comprensione è che in modo simile a + e * operatori:

1 + 2 * 3 + 4 

che si risolve come

1 + (2 * 3) + 4 

dovrebbe essere pari a:

x = (1 && y) = 2 

Tuttavia, tutte le fonti di Ruby (tra cui la sintassi del parser Ripper) analizzano questo come

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

Perché?


EDIT [2016/08/01] attenzione

Let su una sottoespressione: 1 && y = 2

Secondo le regole di precedenza, dovremmo cercare di analizzare come:

(1 && y) = 2 

che non ha senso perché = richiede un LHS specifico (variabile, costante,Elemento dell'arrayecc.). Ma dal momento che (1 && y) è un'espressione corretta, come deve comportarsi il parser?

Ho provato a consultare Ruby parse.y, ma è così simile a spaghetti che non riesco a capire le regole specifiche per l'assegnazione.

+0

Bella domanda, c'è qualche merito nell'argomento. –

risposta

2

Semplice. Ruby lo interpreta solo in un modo che ha senso. = è un incarico. Nella vostra aspettativa:

x = (1 && y) = 2 

che non ha senso assegnare qualcosa da 1 && y. Puoi solo assegnare qualcosa a una variabile o una costante.

E si noti che lo scopo della regola della precedenza è disambiguare un'espressione altrimenti ambigua. Se un modo per interpretarlo non ha senso, allora non c'è bisogno di disambiguazione, e quindi la regola della precedenza non sarebbe in vigore.

+2

Parser utilizza le regole, non ha un'intelligenza per differenziare ciò che ha un senso e ciò che non lo fa, quindi la tua risposta non è informativa. –

+0

@ RustamA.Gasanov Controllare se la parte sinistra dell'assegnazione è una variabile o una costante non richiede intelligenza. Può essere fatto senza eseguire il codice. – sawa

+0

In realtà sto provando a scrivere un parser di Ruby per imparare meglio gli interni di Ruby. E la tua risposta non aiuta davvero. 'x = 1 && y' (uguale a' x = (1 && y) ') è un'espressione fine a sé stante quale parser è felice di accettare secondo le regole grammaticali generali. Pertanto, sto cercando un meccanismo specifico nella grammatica di Ruby per analizzare prima y = 2' in questo caso. – Michael

0

mia comprensione è che nel caso di

x = 1 && y = 2 

La logica AND è analizzato prima. L'AND è quindi costretto a valutare il suo lato sinistro e il suo lato destro. Nella valutazione sul lato sinistro avviene il primo incarico, e poi nella valutazione del lato destro il secondo fa lo stesso. È per questo motivo che nel caso di:

x = false && y = 2 

"y" non verrà mai assegnato.L'AND viene colpito, costringendo l'assegnazione x a valutare, ma senza mai preoccuparsi di eseguire l'assegnazione y, poiché non è necessario che l'AND realizzi il suo scopo. In altre parole, il parser è, ancora una volta, semplicemente per la mia comprensione, abbastanza intelligente da riconoscere che nell'esecuzione di AND l'equazione è divisa in un lato sinistro e uno destro (equazioni), che sono a loro volta valutate in base al ordine di operazione.

+0

L'operatore 'e' si comporta come descritto. '&&' è interpretato come 'x = (1 && (y = 2))'. Sì, se '1' doveva essere sostituito da' false'/'nil' quindi' y = 'l'assegnazione non sarebbe stata risolta affatto, ma non a causa del valore' x', ma a causa del lato sinistro dell'espressione interna ('1 && (y = 2)'). – Michael