Cómo utilizar una variable para la parte clave de un mapa


109

Digamos que tengo

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

¿Cómo creo un Mapdónde, en lugar de

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

Obtengo en cambio el equivalente a escribir

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

pero ¿se pueden utilizar variables Ay Xpara la clave?

PD: La misma pregunta para la parte de valor del mapa.

Respuestas:


168

Utilizar este:

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

Para la parte de valor, es aún más fácil, ya que no se produce una conversión automática de texto a cadena:

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

11
Solo para proporcionar una referencia: la documentación del mapa dice:To use the value of a String as the key value of a map, simply surround the variable with parenthesis.
— mmigdol

1
@mmigdol esta cita es de documentación antigua y maravillosa en la documentación más reciente, es así: 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

Entonces, ¿cuál es la diferencia entre def map = [(A): 1, (X): 2]. y def map = ["$ A": 1, (X): 2] si hay alguno?
— TriMix

2
@TriMix la diferencia es Strings vs GStrings. Con [(A):1, (X):2], la variable se escapa a una cadena. Con ["$A":1, (X):2], "$A"es una cadena interpolada que da como resultado una GString. Los mapas esperan que las claves sean inmutables, lo que no proporciona un GString.
— Josh Lyon

20

Además de la respuesta de Joachim , si desea agregar entradas a un mapa existente y las claves son variables, use:

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

Si utiliza:

map.A = 2

Se supone que desea utilizar la cadena literal 'A' como clave (aunque hay una variable denominada A en el alcance.

Actualizar

Como @tim_yates señaló en un comentario, una variable clave también se resolverá si usa:

map."$A" = 2

aunque personalmente prefiero usar la [A]sintaxis porque las herramientas de refactorización pueden perder la "$A"referencia si se cambia el nombre de la variable


6
la map."$A"sintaxis le brinda el beneficio de una navegación de mapa segura y nula con map?."$A", que AFAIK no puede lograr usando la map[A]sintaxis
— Ghiro
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.