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


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"ссылку, если переменная будет переименована


6
map."$A"синтаксис дает вам преимущество нулевой безопасной карты навигации с map?."$A", что AFAIK вы не можете достичь с помощью map[A]синтаксиса
Ghiro
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.