2016-01-10 7 views
6

Ich lerne Groovy und bin ziemlich beeindruckt, wie es ermöglicht, ein intelligentes DSL zu bauen, aber ich bin etwas verwirrt durch die Regeln für, wenn Klammern und Punkte optional sind. Betrachten Sie den folgenden Code ein:Groovy optionale Klammern und Punkte

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

Dies funktioniert wie erwartet und erzeugt eine Leistung von 7 (wenn in der Konsole lief), so stark, dass letzte Zeile als take(3).plus(4) versteht.

Jetzt funktioniert println take 3 plus 4 nicht, wie groovy versteht, dass als println(take).3(plus).4 was Unsinn ist. aber anscheinend

s = take 3 plus 4 

Werke und speichert das Ergebnis 7 in s

Jedes Beispiel, das ich zeigt diese Art von Ausdruck von sich auf einer Linie, sehe. Meine Frage ist, warum

println(take 3 plus 4) 

nicht funktioniert? Offensichtlich wird groovy diese Art von Ausdrücken analysieren, auch wenn sie selbst nicht auf einer Linie sind (wie die Arbeit zeigt). Ich hätte gedacht, dass das Hinzufügen dieser Klammern die Mehrdeutigkeit aus der Form dieser Zeile entfernen würde, die nicht funktioniert, und dass sie 7 so ausgeben würde, wie ich es beabsichtigte.

Stattdessen gibt groovy einen Fehler 'unerwarteter Token: 3'. Soweit ich das beurteilen kann, erlaubt groovy keine optionalen Klammern oder Punkte in diesem println, obwohl es nicht mehrdeutig zu sein scheint. Wann genau funktioniert diese Art von Trick?

Antwort

2

Dies fällt in die Kategorie eines verschachtelten Methodenaufrufs, und in diesem Fall können Sie die Klammern nicht weglassen. Dies führt zu Mehrdeutigkeiten und die Ergebnisse sind unerwartet, da die Methode printl denkt, dass Sie mehrere Parameter übergeben. Sie können die Mehrdeutigkeit reduzieren, indem Sie in der println-Methode eine groovige Zeichenfolge verwenden.

println "${take 3 plus 4}" 

Weitere Informationen: Omit Parentheses

+1

dieser Adresse würde, warum 'println 3 nehmen und 4' nicht funktioniert, aber nicht, warum 'println (nehmen Sie 3 plus 4)' nicht wie es sollte nicht sei dort irgendeine Zweideutigkeit (wenn es als multiple Parameter interpretiert werden würde, würde es ein Komma zwischen ihnen geben, also sollte groovy in der Lage sein zu bestimmen, dass das nicht gemeint ist). Außerdem sagt dieser Link, dass er auch nicht in der Zuweisung funktionieren sollte (obwohl das Codebeispiel das funktioniert), aber das tut er auch. Ich frage mich, ob das jetzt etwas veraltet ist. Der Sprachführer ist nicht so streng und schlägt vor, dass es funktionieren sollte, wenn es wie dieses letzte Formular verpackt wird. – Matthew

+0

+1 für mich zu zeigen, wie ich das in einem println arbeiten kann, aber ich bin mir nicht sicher, ob dies meine Frage vollständig beantwortet. – Matthew

+0

Dies ist mehrdeutig, da die println-Methode den Code nicht auszuwerten weiß ** nimm 3 plus 4 ** _zu_ ** nimm (3) .plus (4) **, bevor du seine Operation darauf ausführst. Alles rechts neben einem '=' - Zeichen ist ein Ausdruck und wird ausgewertet, bevor er der Variablen zugewiesen wird. Die $ {} sagen zuerst diesen Code auswerten, dann println darauf aufrufen. – dspano