Jak używać zmiennej dla kluczowej części mapy

109

Powiedzmy, że tak

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

jak utworzyć Mapgdzie zamiast

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

Zamiast tego dostaję odpowiednik pisania

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

ale czy można użyć zmiennych Ai Xklucza?

PS: To samo pytanie dla wartościowej części mapy.

Promień
źródło

Odpowiedzi:

168

Użyj tego:

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

W przypadku części zawierającej wartość jest to jeszcze łatwiejsze, ponieważ nie ma automatycznej konwersji tekstu na ciąg znaków:

def map = [keyA:A, keyX:X]
Joachim Sauer
źródło
11
Tylko dla odniesienia: Dokumentacja mapy mówi:To use the value of a String as the key value of a map, simply surround the variable with parenthesis.
mmigdol,
1
@mmigdol ten cytat pochodzi ze starej groovy dokumentacji w najnowszej dokumentacji wygląda tak: 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..
Michał Bernhard
Jaka jest więc różnica między def map = [(A): 1, (X): 2]. and def map = ["$ A": 1, (X): 2] jeśli istnieje?
TriMix
2
@TriMix różnica jest Strings vs GStrings. W [(A):1, (X):2]przypadku zmiennej zmienna jest zapisywana w łańcuchu. W ["$A":1, (X):2]przypadku "$A"jest to interpolowany ciąg znaków, którego wynikiem jest ciąg GString. Mapy oczekują, że klucze będą niezmienne, czego nie zapewnia GString.
Josh Lyon
20

W nawiązaniu do odpowiedzi Joachima , jeśli chcesz dodać wpisy do istniejącej mapy, a klucze są zmiennymi, użyj:

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

Jeśli użyjesz:

map.A = 2

Zakłada się, że chcesz użyć literału „A” jako klucza (nawet jeśli w zasięgu znajduje się zmienna o nazwie A.

Aktualizacja

Jak @tim_yates wskazał w komentarzu, kluczowa zmienna zostanie również rozwiązana, jeśli użyjesz:

map."$A" = 2

chociaż osobiście wolę używać [A]składni, ponieważ narzędzia refaktoryzujące mogą przeoczyć "$A"odniesienie, jeśli zmieniona zostanie nazwa zmiennej

Dónal
źródło
6
map."$A"składnia daje korzyści z zerowej bezpiecznej nawigacji z mapy map?."$A", która AFAIK nie można osiągnąć za pomocą map[A]składni
Ghiro