So verwenden Sie eine Variable für den Schlüsselteil einer Karte


109

Nehmen wir an, ich habe

def A = "abc"
def X = "xyz"

Wie erstelle ich ein MapWo anstelle von

def map = [A:1, X:2]

Ich bekomme stattdessen das Äquivalent zum Schreiben

def map = [abc:1, xyz:2]

aber kann eine Variable Aund Xfür den Schlüssel verwenden?

PS: Gleiche Frage für den Werteteil der Karte.

Antworten:


168

Benutze das:

def map = [(A):1, (X):2]

Für den Wertteil ist es noch einfacher, da kein automatisches "Konvertieren von Text in Zeichenfolge" stattfindet:

def map = [keyA:A, keyX:X]

11
Bietet nur eine Referenz: die Karte Dokumentation sagt:To use the value of a String as the key value of a map, simply surround the variable with parenthesis.
— mmigdol

1
@mmigdol dieses Zitat ist aus der alten groovigen Dokumentation in der neuesten Dokumentation es ist wie folgt : Map keys are strings by default: [a:1] is equivalent to ['a':1]. This can be confusing if you define a variable named a and that you want the value of to be the key in your map. If this is the case, then you must escape >the key by adding parenthesis..
— Michal Bernhard

Was ist also der Unterschied zwischen def map = [(A): 1, (X): 2]? und def map = ["$ A": 1, (X): 2] falls vorhanden?
— TriMix

2
@TriMix der Unterschied ist Strings vs GStrings. Mit [(A):1, (X):2]wird die Variable in einen String maskiert. Mit ["$A":1, (X):2]ist das "$A"eine interpolierte Zeichenfolge, die zu einem GString führt. Karten erwarten, dass die Schlüssel unveränderlich sind, was ein GString nicht bietet.
— Josh Lyon

20

Wenn Sie neben Joachims Antwort Einträge zu einer vorhandenen Karte hinzufügen möchten und die Schlüssel Variablen sind, verwenden Sie:

def map = [:]
def A = 'abc'
map[A] = 2

Wenn du benutzt:

map.A = 2

Es wird davon ausgegangen, dass Sie die Literalzeichenfolge 'A' als Schlüssel verwenden möchten (obwohl im Gültigkeitsbereich eine Variable mit dem Namen A vorhanden ist.

Aktualisieren

Wie @tim_yates in einem Kommentar hervorhob, wird eine Schlüsselvariable auch aufgelöst, wenn Sie Folgendes verwenden:

map."$A" = 2

Ich persönlich bevorzuge jedoch die Verwendung der [A]Syntax, da Refactoring-Tools möglicherweise die "$A"Referenz verfehlen, wenn die Variable umbenannt wird


6
Die map."$A"Syntax bietet Ihnen den Vorteil einer null-sicheren Kartennavigation, mit map?."$A"der Sie map[A]
— AFAIK
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.