辞書のコピー
CoddyのGDScriptジャーニー「ロジックとフロー」セクションの一部。レッスン 22/78。
辞書を別の変数に代入しても、コピーは作成されません。どちらの変数も同じ辞書を参照するため、一方を通して変更すると、もう一方にも反映されます:
var template := {"type": "slime", "hp": 30}
var enemy := template
enemy["hp"] = 10
print(template["hp"]) # 10duplicate()は同じペアを持つ新しい辞書を作成します。コピーを変更しても、元の辞書には影響しません。
var original := {"type": "slime", "hp": 30}
var copy := original.duplicate()
copy["hp"] = 99
print(original["hp"]) # 30duplicate()は浅いコピーを作成します。コピーは独自のキーと値のペアを持ちますが、配列または辞書である値は、2つの間で共有されたままです。
var hero := {"stats": {"hp": 100}, "items": ["sword"]}
var clone := hero.duplicate()
clone["stats"]["hp"] = 1
clone["items"].append("shield")
print(hero){ "stats": { "hp": 1 }, "items": ["sword", "shield"] }ディープコピーを行うにはtrueを渡します。duplicate(true)は内部のすべての配列と辞書もコピーするため、2つの間で共有されるものはありません。
var twin := hero.duplicate(true)
twin["stats"]["hp"] = 50
print(hero["stats"]["hp"]) # 1すべての値が数値、文字列、またはブール値の場合は、浅いコピーで十分です。値が配列または辞書の場合は、すぐにduplicate(true)を使用してください。配列も同様に動作します。grid.duplicate(true)は、2次元配列を行とともにコピーします。
チャレンジ
簡単テンプレートから敵の一群を生成します。辞書 template が与えられます。プログラムは、敵を何体生成するか(n)と hp ボーナスの2つの整数を、1行に1つずつ読み取ります。
1 から n までの各敵番号 i について:
templateと何も共有しないコピーを作成します。- 値
iを持つキー"id"を追加します。 "stats"内の"hp"にbonus * iを加算します。- 最後の敵であれば、その
"loot"に"crown"を追加します。 - 敵を出力します。
最後に、Template: に続けてテンプレートを出力します。テンプレートは変更されていない必要があります。入力が 2 と 10 の場合、出力は次のとおりです:
{ "type": "slime", "stats": { "hp": 40, "speed": 2 }, "loot": ["gel"], "id": 1 }
{ "type": "slime", "stats": { "hp": 50, "speed": 2 }, "loot": ["gel", "crown"], "id": 2 }
Template: { "type": "slime", "stats": { "hp": 30, "speed": 2 }, "loot": ["gel"] }自分で試してみよう
extends Node
func _ready():
var template := {"type": "slime", "stats": {"hp": 30, "speed": 2}, "loot": ["gel"]}
var n := int(OS.read_string_from_stdin())
var bonus := int(OS.read_string_from_stdin())
# n 体の敵を生成して出力する
# template を出力する
pass
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: GDScriptオンラインコンパイラ