辞書のマージ
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がすでに持っていた値を保持しました。デフォルトでは、既存のキーは上書きされません。もう一方の辞書の値を優先するには、2番目の引数として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" }キーが両方の辞書にあり、値を組み合わせたい場合(たとえば、2つの金額を合計する場合)は、自分でループを書きます。
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のペアとして1行の入力から読み込まれます(行は空の場合もあります)。与えられたコードは、それらを辞書savedに格納します。
保存データにない設定を補完してください。まだキーが含まれていないdefaultsのペアをすべて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オンラインコンパイラ