合并字典
本课属于 Coddy GDScript 学习旅程的“逻辑与流程”单元。第 21 课,共 78 课。
merge() 会将另一个字典中的每一对键值添加到调用它的字典中。仅存在于另一个字典中的键会添加到末尾:
var settings := {"volume": 5, "difficulty": "normal"}
var saved := {"difficulty": "hard", "subtitles": true}
settings.merge(saved)
print(settings){ "volume": 5, "difficulty": "normal", "subtitles": true }"difficulty" 同时存在于两个字典中,而 merge() 保留了 settings 中已有的值:默认情况下,现有键不会被覆盖。将 true 作为第二个参数传入,让另一个字典中的值优先:
var options := {"volume": 5, "difficulty": "normal"}
options.merge(saved, true)
print(options["difficulty"]) # hardmerge() 会直接修改字典本身,并且不返回任何内容,因此 var result := a.merge(b) 会导致错误。要保留两个字典原样不变,请使用 merged()。它接受相同的参数,并返回一个新字典:
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" }如果某个键同时存在于两个字典中,并且你想合并它们的值,例如把两个金额相加,可以自己编写循环:
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 }挑战
简单游戏更新添加了新设置。玩家保存的设置会从一行输入中读取,格式为用逗号分隔的 key=value 键值对(这一行可以为空)。给定的代码会将这些设置存储在字典 saved 中。
补全保存数据中缺少的设置:将 defaults 中所有键尚未包含在 saved 中的键值对添加到 saved,不要更改玩家选择的值,也不要更改 defaults。然后打印 saved,并在下一行打印 defaults。
对于输入 difficulty=hard,volume=8,输出为:
{ "difficulty": "hard", "volume": "8", "subtitles": "off", "language": "en" }
{ "difficulty": "normal", "volume": "5", "subtitles": "off", "language": "en" }亲手试试
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]
# 将缺少的默认值添加到 saved,然后打印两个字典
pass
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: GDScript 在线编译器