Menu
CoddyTech

Gộp từ điển

Thuộc phần Logic và luồng chương trình trong hành trình GDScript của Coddy. Bài học 21 trên 78.

merge() thêm từng cặp khóa và giá trị từ một từ điển khác vào từ điển mà bạn gọi phương thức này. Các khóa chỉ có trong từ điển kia sẽ được thêm vào cuối:

var settings := {"volume": 5, "difficulty": "normal"}
var saved := {"difficulty": "hard", "subtitles": true}
settings.merge(saved)
print(settings)
{ "volume": 5, "difficulty": "normal", "subtitles": true }

"difficulty" có trong cả hai từ điển, và merge() giữ lại giá trị mà settings đã có: theo mặc định, các khóa hiện có không bị ghi đè. Truyền true làm đối số thứ hai để dùng giá trị từ từ điển còn lại:

var options := {"volume": 5, "difficulty": "normal"}
options.merge(saved, true)
print(options["difficulty"]) # hard

merge() thay đổi chính từ điển đó và không trả về gì, vì vậy var result := a.merge(b) là lỗi. Để giữ nguyên cả hai từ điển, hãy dùng merged(). Phương thức này nhận cùng các đối số và trả về một từ điển mới:

var defaults := {"volume": 5, "difficulty": "normal"}
var choice := {"difficulty": "hard"}
var final_settings := defaults.merged(choice, true)
print(final_settings) # { "volume": 5, "difficulty": "hard" }
print(defaults) # { "volume": 5, "difficulty": "normal" }

Khi một khóa có trong cả hai từ điển và bạn muốn kết hợp các giá trị, chẳng hạn như cộng hai khoản tiền, hãy tự viết vòng lặp:

var bag := {"gold": 10, "gems": 1}
var loot := {"gold": 5, "keys": 2}
for key in loot:
	bag[key] = bag.get(key, 0) + loot[key]
print(bag) # { "gold": 15, "gems": 1, "keys": 2 }
challenge icon

Thử thách

Dễ

Một bản cập nhật trò chơi đã thêm các cài đặt mới. Các cài đặt đã lưu của người chơi được đọc từ một dòng đầu vào, viết dưới dạng các cặp key=value ngăn cách bằng dấu phẩy (dòng này có thể để trống). Đoạn code đã cho lưu chúng vào từ điển saved.

Điền các cài đặt còn thiếu vào bản lưu: thêm vào saved mọi cặp trong defaults có khóa chưa có trong đó, không thay đổi các giá trị người chơi đã chọn và không thay đổi defaults. Sau đó in ra saved, rồi in ra defaults ở dòng tiếp theo.

Với đầu vào difficulty=hard,volume=8, đầu ra là:

{ "difficulty": "hard", "volume": "8", "subtitles": "off", "language": "en" }
{ "difficulty": "normal", "volume": "5", "subtitles": "off", "language": "en" }

Tự làm thử

extends Node

func _ready():
	var defaults := {"difficulty": "normal", "volume": "5", "subtitles": "off", "language": "en"}
	var saved := {}
	for pair in OS.read_string_from_stdin().split(",", false):
		var parts := pair.split("=")
		saved[parts[0]] = parts[1]

	# Thêm các giá trị mặc định còn thiếu vào saved, rồi in ra cả hai từ điển (dictionary)
	pass
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng chương trình

Tự luyện tập: Trình biên dịch GDScript online