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.

Strahl
quelle

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]
Joachim Sauer
quelle
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

Dónal
quelle
6
Die map."$A"Syntax bietet Ihnen den Vorteil einer null-sicheren Kartennavigation, mit map?."$A"der Sie map[A]
AFAIK