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.