Como usar uma variável para a parte principal de um mapa

109

Digamos que tenho

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

como faço para criar um Maponde, em vez de

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

Em vez disso, recebo o equivalente a escrever

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

mas pode usar variáveis Ae Xpara a chave?

PS: Mesma pergunta para a parte de valor do mapa.

Raio
fonte

Respostas:

168

Usa isto:

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

Para a parte do valor é ainda mais fácil, já que não há nenhuma magia automática "converter texto em string" acontecendo:

def map = [keyA:A, keyX:X]
Joachim Sauer
fonte
11
Apenas para fornecer uma referência: a documentação do mapa diz: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ção é de uma documentação velha e bacana na documentação mais recente é assim: 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
Então, qual é a diferença entre def map = [(A): 1, (X): 2]. e def map = ["$ A": 1, (X): 2] se houver?
TriMix
2
@TriMix a diferença é Strings vs GStrings. Com [(A):1, (X):2], a variável está sendo escapada em uma String. Com ["$A":1, (X):2], "$A"é uma string interpolada que resulta em um GString. Os mapas esperam que as chaves sejam imutáveis, o que um GString não fornece.
Josh Lyon
20

Na sequência da resposta de Joachim , se você quiser adicionar entradas a um mapa existente e as chaves são variáveis, use:

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

Se você usar:

map.A = 2

Presume-se que você deseja usar a string literal 'A' como a chave (embora haja uma variável chamada A no escopo.

Atualizar

Como @tim_yates apontou em um comentário, uma variável-chave também será resolvida se você usar:

map."$A" = 2

embora pessoalmente eu prefira usar a [A]sintaxe porque as ferramentas de refatoração podem perder a "$A"referência se a variável for renomeada

Dónal
fonte
6
a map."$A"sintaxe oferece o benefício de navegação nula segura no mapa map?."$A", que AFAIK você não pode alcançar usando a map[A]sintaxe
Ghiro,