Cara menggunakan variabel untuk bagian kunci peta

109

Katakanlah saya punya

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

bagaimana cara membuat Maptempat, bukan

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

Saya malah mendapatkan padanan menulis

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

tapi bisa menggunakan variabel Adan Xuntuk kuncinya?

PS: Pertanyaan yang sama untuk bagian nilai dari peta.

sinar
sumber

Jawaban:

168

Gunakan ini:

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

Untuk bagian nilai, ini lebih mudah, karena tidak ada "ubah teks menjadi string" otomatis yang terjadi:

def map = [keyA:A, keyX:X]
Joachim Sauer
sumber
11
Hanya untuk memberikan referensi: Dokumentasi Peta mengatakan:To use the value of a String as the key value of a map, simply surround the variable with parenthesis.
mmigdol
1
@mmigdol kutipan ini berasal dari dokumentasi asyik lama dalam dokumentasi terbaru seperti ini: 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
Jadi apa perbedaan antara def map = [(A): 1, (X): 2]. dan def map = ["$ A": 1, (X): 2] jika ada?
TriMix
2
@Triix perbedaannya adalah Strings vs GStrings. Dengan [(A):1, (X):2], variabel di-escape menjadi String. Dengan ["$A":1, (X):2], "$A"adalah string interpolasi yang menghasilkan GString. Peta mengharapkan kunci menjadi tidak berubah yang tidak disediakan GString.
Josh Lyon
20

Selanjutnya jawaban Joachim , jika Anda ingin menambahkan entri ke peta yang ada dan kuncinya adalah variabel, gunakan:

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

Jika Anda menggunakan:

map.A = 2

Diasumsikan bahwa Anda ingin menggunakan string literal 'A' sebagai kunci (meskipun ada variabel bernama A dalam cakupan.

Memperbarui

Seperti yang ditunjukkan @tim_yates dalam komentar, variabel kunci juga akan diselesaikan jika Anda menggunakan:

map."$A" = 2

meskipun secara pribadi saya lebih suka menggunakan [A]sintaks karena alat refactoring mungkin kehilangan "$A"referensi jika variabel diganti namanya

Dónal
sumber
6
yang map."$A"sintaks memberikan manfaat dari nol peta navigasi yang aman dengan map?."$A"yang AFAIK Anda tidak dapat mencapai menggunakan map[A]sintaks
Ghiro