2016-01-10 13 views
6

Sto imparando Groovy e sono abbastanza impressionato da come permette di costruire un DSL intelligente, ma sono un po 'confuso dalle regole per quando parentesi e punti sono opzionali. Si consideri il seguente codice:Groovy parentesi e punti opzionali

Integer take(Integer x) {x} 
take 3 plus 4 

Questo funziona come previsto e produce una potenza di 7 (quando correva nella console), come Groovy capisce che ultima riga come take(3).plus(4).

Ora, println take 3 plus 4 non funziona come Groovy capisce che come println(take).3(plus).4 che è una sciocchezza.

Ogni esempio che sto vedendo spettacoli questo genere di espressione da soli su una linea, ma a quanto pare

s = take 3 plus 4 

opere e memorizza il risultato 7 a s. La mia domanda è: perché

println(take 3 plus 4) 

non funziona? Ovviamente, groovy analizzerà questo tipo di espressioni anche se non sono da sole su una riga (come mostrato dall'assegnazione funzionante). Avrei pensato che l'aggiunta di quelle parentesi avrebbe rimosso l'ambiguità dalla forma di quella linea che non funziona e che avrebbe stampato 7 come volevo.

Invece groovy restituisce un errore 'token imprevisto: 3'. Per quanto ne so, Groovy non permetterà parentesi o punti opzionali all'interno di quella stampante, anche se non sembra essere ambiguo. Quando funziona esattamente questo tipo di trucco?

risposta

2

Questo rientra nella categoria di una chiamata di metodo nidificata, e in tal caso non è possibile omettere le parentesi. Questo sta causando ambiguità e i risultati sono inaspettati, poiché il metodo println pensa che tu stia passando più parametri. È possibile ridurre l'ambiguità utilizzando una stringa groovy nel metodo println.

println "${take 3 plus 4}" 

Maggiori informazioni: Omit Parentheses

+1

che affronti il ​​motivo per cui 'println prendono 3 più 4' non funziona, ma non è per questo' println (prendono 3 più 4) 'non lo fa, come non ci dovrebbero ci sia qualche ambiguità lì (se dovesse essere interpretata come più parametri, ci sarebbe una virgola tra di loro così groovy dovrebbe essere in grado di determinare che non è ciò che si intendeva). Inoltre, quel link dice che non dovrebbe funzionare nemmeno nell'assegnazione (sebbene l'esempio di codice lo mostri funzionante), ma lo fa. Mi chiedo se sia un po 'obsoleto ora. La guida linguistica non è così rigorosa e suggerisce che dovrebbe funzionare quando è avvolto come l'ultima forma. – Matthew

+0

+1 per avermi mostrato come posso farlo funzionare in una stampante, ma non sono sicuro che questo risponda pienamente alla mia domanda. – Matthew

+0

Questo è ambiguo perché il metodo println non è in grado di valutare il codice ** accetta 3 più 4 ** _to_ ** take (3) .plus (4) ** prima di eseguirne l'operazione. Tutto a destra di un segno '=' è un'espressione e viene valutato prima di essere assegnato alla variabile. I $ {} stanno dicendo valutare prima questo codice, quindi chiamare println su di esso. – dspano