Die Unterstützung benannter Parameter ist ziemlich flexibel, aber die Dokumente sind ein wenig dünn. Hier sind einige der Regeln, die ich entdeckt habe. Bitte beachte, dass ich versuche, eindeutig in den Anwender-Parameter (in der Methode deklariert) und args (zum Methodenaufruf übergeben)
- Der Map-Parameter zunächst zuerst deklariert werden müssen. Das ist der Große. Und nicht offensichtlich.
- Sie keine vollständige Karte in Ihrem args benötigen, nur Elemente Karte dh
(a: "aa")
gut genug ist, brauchen Sie nicht ([a: "aa"])
- Sie können mit dem Namen args, so lange als die bestellte (unbenannt) args mix geordnete Argumente bleiben in der gleichen Reihenfolge wie die Parameter Sie füllen
- Sie können benannte Args mit regulären geordneten Args interspersen. Das ist ziemlich cool, aber wieder die bestellten Args müssen in, gut, um.
- Sie können auch optional bestellt Parameter in der gleichen Methodensignatur (siehe
x
in den Beispielen unten) verwenden
- Sie die Karte Parameter die eine Standard leeren Karte
args=[:]
machen args optional genannt geben kann, aber dies nicht gut funktionieren, wenn Sie weitere optionale Parameter (siehe letzte Beispiele unten)
Hier sind einige Beispiele haben: Die params nicht brauchen werden eingegeben, aber ich habe Typen für Klarheit hinzugefügt.
// this method has a map args to capture all named args
// and non-named (ordered) args String s, int n, and int x
// x has a default value so is optional
// the map (here untyped) to capture the nameed args MUST COME FIRST
def m(Map args=[:], String s, int n, int x=1)
{
println "s:$s n:$n x:$x, args:$args"
}
//1: pass in named args first, then ordered
m(a: "aa", b: 3, "ss", 44, 5) // s:s n:44 x:5, args:[a:aa, b:3]
//2: ordered args first - named args last (same result)
m("ss", 44, 5, a: "aa", b: 3) // s:s n:44 x:5, args:[a:aa, b:3]
//3: bring the first ordered arg (s) to the start (same result)
m("ss", a: "aa", b: 3, 44, 5) // s:s n:44 x:5, args:[a:aa, b:3]
//4: stick the ordered arg n in the middle of the named args (same result!)
m("ss", a: "aa", 44, b: 3, 5) // s:s n:44 x:5, args:[a:aa, b:3]
//5: mix the ordered args in with the named and SKIP the arg x with default value (x=1)
m(a: "aa", "ss", b: 3, 44) // s:ss n:44 x:1, args:[a:aa, b:3]
//6: ordered arg n first - so in the wrong order (Fail!)
//m(44, "ss", a: "aa", b: 3, 5) //MissingMethodException: No signature .. of .. m() .. applicable for
// argument types: (java.util.LinkedHashMap, java.lang.Integer, java.lang.String, java.lang.Integer)
// values: [[a:aa, b:3], 44, ss, 5]
//7: no named args: Fails! (change signature to add default: Map args=[:] and it will succeed with: s:ss n:44 x:1, args:[:]
m("ss", 44) // ...No signature ... applicaple ... types (java.lang.String, java.lang.Integer)
//8: no named args: Fails! (even with default map in signature this fails!)
m("ss", 44, 5) // ...No signature ... applicaple ... types (java.lang.String, java.lang.Integer, java.lang.Integer)
mir nicht bewusst, groovy Parameter unterstützt jetzt genannt ... Ihr Beispiel in meinem groovy-2.0.6 – Will
Sie befinden sich nicht funktioniert (teilweise) Recht - ich habe meine Frage aktualisiert. Zum Teil, weil mein Beispiel falsch ist, aber groovy unterstützt benannte Parameter. http://mrhaki.blogspot.de/2009/09/groovy-goodness-named-parameters-are.html - hey, ich denke, das ist die Lösung für meine Frage ... – rdmueller