辞書パターン
CoddyのGDScriptジャーニー「ロジックとフロー」セクションの一部。レッスン 9/78。
辞書パターンは、キーとその値が一致しなければならないパターンを列挙します。順序を問わず、ちょうどそれらのキーを持つ辞書に一致します。
var event := {"type": "move", "dir": "left"}
match event:
{"type": "jump"}:
print("Jump!")
{"type": "move", "dir": var d}:
print("Moving ", d)Moving left"type"の値は"move"でなければならず、"dir"の値は何であれ、dに格納されます。パターンに指定されていないキーを持つ辞書は一致しません。余分なキーを許可するには、末尾に..を追加します。
var hit := {"type": "attack", "damage": 30, "crit": true}
match hit:
{"type": "attack", "damage": _}:
print("Exactly two keys")
{"type": "attack", "damage": var dmg, ..}:
print("Hit for ", dmg)Hit for 30値を指定せずに記述したキーは、そのキーが存在するかどうかだけを確認します。{"name", ..}: は、"name" キーを持つすべての辞書に一致します。ここでもガードを使えます。{"type": "attack", "damage": var dmg} when dmg > 50:。
チャレンジ
簡単プログラムは、カンマで区切られたkey=value形式のペア(例: type=move,dir=left)で記述されたゲームイベントを読み取り、辞書event(すでに記述済み)に格納します。すべての値は文字列です。
辞書パターンを使ったmatch文を、次の順序で使用します。
- キーが
type("move")とdirだけの場合:Movingと方向を出力する - キーが
type("attack")とdamageだけの場合:Taking、ダメージ、damageを出力する typeが"heal"で、ほかのキーがある場合:Healingを出力するtypeキーを持つほかの辞書の場合:Unknown event:と型を出力する- それ以外の場合:
Invalid eventを出力する
入力がtype=attack,damage=30の場合、出力は次のとおりです。
Taking 30 damagetype=move,dir=up,speed=2のようなイベントには余分なキーがあるため、Unknown event: moveを出力します。
自分で試してみよう
extends Node
func _ready():
var event := {}
for pair in OS.read_string_from_stdin().split(","):
var kv := pair.split("=")
event[kv[0]] = kv[1]
# event を辞書パターンと照合する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: GDScriptオンラインコンパイラ