Come utilizzare una variabile per la parte fondamentale di una mappa


109

Diciamo che l'ho fatto

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

come creo un Mapdove, invece di

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

Ottengo invece l'equivalente della scrittura

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

ma può usare una variabile Ae Xper la chiave?

PS: stessa domanda per la parte di valore della mappa.

Risposte:


168

Usa questo:

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

Per la parte relativa al valore è ancora più semplice, dal momento che non avviene alcun "converti testo in stringa" automagic:

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

11
Solo per fornire un riferimento: la documentazione della mappa dice:To use the value of a String as the key value of a map, simply surround the variable with parenthesis.
mmigdol

1
@mmigdol questa citazione proviene dalla vecchia documentazione groovy nella documentazione più recente è così: 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

Allora qual è la differenza tra def map = [(A): 1, (X): 2]. e def map = ["$ A": 1, (X): 2] se presente?
TriMix

2
@TriMix la differenza è Strings vs GStrings. Con [(A):1, (X):2], la variabile viene sottoposta a escape in una String. Con ["$A":1, (X):2], "$A"è una stringa interpolata che risulta in un GString. Le mappe si aspettano che le chiavi siano immutabili che un GString non fornisce.
Josh Lyon

20

Oltre alla risposta di Joachim , se vuoi aggiungere voci a una mappa esistente e le chiavi sono variabili, usa:

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

Se utilizzi:

map.A = 2

Si presume che si desideri utilizzare la stringa letterale "A" come chiave (anche se è presente una variabile denominata A nell'ambito.

Aggiornare

Come ha sottolineato @tim_yates in un commento, anche una variabile chiave verrà risolta se si utilizza:

map."$A" = 2

anche se personalmente preferisco usare la [A]sintassi perché gli strumenti di refactoring potrebbero perdere il "$A"riferimento se la variabile viene rinominata


6
la map."$A"sintassi ti offre il vantaggio di una navigazione cartografica nulla sicura con map?."$A", che AFAIK non puoi ottenere usando la map[A]sintassi
Ghiro
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.