Comment utiliser une variable pour la partie clé d'une carte

109

Disons que j'ai

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

comment créer un Mapoù, au lieu de

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

J'obtiens à la place l'équivalent de l'écriture

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

mais peut utiliser des variables Aet Xpour la clé?

PS: Même question pour la partie valeur de la carte.

Rayon
la source

Réponses:

168

Utilisez ceci:

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

Pour la partie valeur, c'est encore plus facile, car il n'y a pas de "conversion de texte en chaîne" automatique:

def map = [keyA:A, keyX:X]
Joachim Sauer
la source
11
Juste pour fournir une référence: la documentation cartographique dit:To use the value of a String as the key value of a map, simply surround the variable with parenthesis.
mmigdol
1
@mmigdol cette citation est tirée de la vieille documentation groovy dans la documentation la plus récente, c'est comme ça: 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
Alors, quel est le diff entre def map = [(A): 1, (X): 2]. et def map = ["$ A": 1, (X): 2] le cas échéant?
TriMix
2
@TriMix la différence est Strings vs GStrings. Avec [(A):1, (X):2], la variable est échappée dans une chaîne. Avec ["$A":1, (X):2], le "$A"est une chaîne interpolée qui donne une GString. Les cartes s'attendent à ce que les clés soient immuables, ce qu'une GString ne fournit pas.
Josh Lyon
20

Suite à la réponse de Joachim , si vous souhaitez ajouter des entrées à une carte existante et que les clés sont des variables, utilisez:

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

Si tu utilises:

map.A = 2

On suppose que vous souhaitez utiliser la chaîne littérale «A» comme clé (même s'il existe une variable nommée A dans la portée.

Mettre à jour

Comme @tim_yates l'a souligné dans un commentaire, une variable clé sera également résolue si vous utilisez:

map."$A" = 2

bien que personnellement je préfère utiliser la [A]syntaxe car les outils de refactoring peuvent manquer la "$A"référence si la variable est renommée

Dónal
la source
6
la map."$A"syntaxe vous donne l'avantage de la navigation nulle sur la carte avec map?."$A", ce que vous ne pouvez pas réaliser map[A]
AFAIK en