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.

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]

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


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,
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.