วิธีใช้ตัวแปรสำหรับส่วนสำคัญของแผนที่


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 Maps คาดว่าคีย์จะไม่เปลี่ยนรูปซึ่ง GString ไม่มีให้
Josh Lyon

20

นอกเหนือจากคำตอบของ Joachimหากคุณต้องการเพิ่มรายการลงในแผนที่ที่มีอยู่และคีย์เป็นตัวแปรให้ใช้:

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

หากคุณใช้:

map.A = 2

สมมติว่าคุณต้องการใช้สตริงตัวอักษร 'A' เป็นคีย์ (แม้ว่าจะมีตัวแปรชื่อ A อยู่ในขอบเขตก็ตาม

อัปเดต

ตามที่ @tim_yates ระบุไว้ในความคิดเห็นตัวแปรหลักจะได้รับการแก้ไขหากคุณใช้:

map."$A" = 2

แม้ว่าโดยส่วนตัวแล้วฉันชอบใช้[A]ไวยากรณ์เนื่องจากเครื่องมือปรับโครงสร้างใหม่อาจพลาดการ"$A"อ้างอิงหากเปลี่ยนชื่อตัวแปร


6
map."$A"ไวยากรณ์จะช่วยให้คุณได้รับประโยชน์จาก null แผนที่นำทางปลอดภัยด้วยmap?."$A"ซึ่ง AFAIK คุณไม่สามารถบรรลุโดยใช้map[A]ไวยากรณ์
Ghiro
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.