Як використовувати змінну для ключової частини карти


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 ця цитата зі старої громіздкої документації в новітній документації її ось така: 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

Отже, яка різниця між def map = [(A): 1, (X): 2]. і def map = ["$ A": 1, (X): 2], якщо такі є?
TriMix

2
@TriMix різниця - Strings vs 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.