Как использовать переменную для ключевой части карты

109

Скажем, у меня есть

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

как мне создать Mapгде вместо

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

Вместо этого я получаю эквивалент письма

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

а можно использовать переменные Aи Xдля ключа?

PS: Тот же вопрос для ценностной части карты.

Луч
источник

Ответы:

168

Использовать это:

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

Для части значения это еще проще, так как не происходит автоматического «преобразования текста в строку»:

def map = [keyA:A, keyX:X]
Иоахим Зауэр
источник
11
Просто для справки: в документации по карте сказано:To use the value of a String as the key value of a map, simply surround the variable with parenthesis.
mmigdol
1
@mmigdol, эта цитата из старой документации Groovy в новейшей документации выглядит так: 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..
Михал Бернхард
Итак, в чем разница между def map = [(A): 1, (X): 2]. и def map = ["$ A": 1, (X): 2], если есть?
TriMix
2
@TriMix разница в строках и GStrings. С [(A):1, (X):2], переменная экранируется в строку. С ["$A":1, (X):2], "$A"это интерполированная строка, которая приводит к GString. Карты ожидают, что ключи будут неизменяемыми, чего не предоставляет GString.
Джош Лайон
20

В дополнение к ответу Иоахима , если вы хотите добавить записи на существующую карту, а ключи являются переменными, используйте:

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

Если вы используете:

map.A = 2

Предполагается, что вы хотите использовать буквальную строку 'A' в качестве ключа (даже если в области видимости есть переменная с именем A.

Обновить

Как отметил @tim_yates в комментарии, ключевая переменная также будет разрешена, если вы используете:

map."$A" = 2

хотя лично я предпочитаю использовать [A]синтаксис, потому что инструменты рефакторинга могут пропустить "$A"ссылку, если переменная будет переименована

Dónal
источник
6
map."$A"синтаксис дает вам преимущество нулевой безопасной карты навигации с map?."$A", что AFAIK вы не можете достичь с помощью map[A]синтаксиса
Ghiro