case 式を使用すると、選択肢のリストからプログラムのフローを制御できます。 Verse の case 文は複数の可能性がある値に対してテストする方法で、(= を使用するのと同様)、一致する値に基づいてコードを実行します。
case 式は、あらゆる種類のアプリケーションで使用され、ゲームのノンプレイヤーキャラクター (NPC) なども該当します。
たとえば、ガード スポナーの仕掛けを使用して、パトロール オプションを有効にしたガードをスポーンします。 ガードをゲームにスポーンした後、ガードには Idle、Patrol、Alert、Attack および Harvest といったアクティブ ステートがあります。 これに対する高レベル ステート遷移図を次に示します。
これらのステートの遷移をゲーム内で確認できます。
このビデオでは、ガードのパトロール オプションがデフォルト動作で有効になっています。
このビデオでは、物理に基づいてパトロールしている状態から資源の収集にガードを遷移します。 続いて、ガードはプレイヤーを見つけます。これによりガードはアラート ステート (疑問符がそばに付く) になり、それから攻撃ステート (感嘆符) に入ります。
ガードに対するステートに応じて、特定の動作が発現します。これらの動作は、一般に関数としてコードに作成されます。これらはプログラムで特定ステートに入ることを選択したときに、呼び出されます。
コードでは、この高レベルのガードステート トランジションは次のようになります。
case(GuardStateVariable):
idle_state =>
RunIdleAnimation()
SearchPlayerCharacter()
harvest_state =>
GatherResources()
alert_state=>
RunAlertAnimation()
PlayAlertSound()
DisplayAlertUIElement()
この case 式は、ガードが特定ステートに入った場合に実行する関数をプログラムに伝えるラベルを渡します。
この式では、ガードの patrol_state がデフォルト ケースで、パトロールが有効であるガードはデフォルトのパトロール動作を実行する必要があるためです。
これは以下の構文になっています。
expression0
case (test-arg-block):
label1 =>
expression1
label2 =>
expression2
_ =>
expression3 for the default case
expression4case ブロックの各パターン (label1 や label2 など) は constant => block の形式を使用する必要があります。constant は整数、ロジック、文字列、文字、列挙型定数です。 つまり case 式は int、logic、string、char、enums とのみ動作します。
構造
構造として、Verse の case 式は、GuardStateVariable テスト引数ブロックの入力を基にコードを実行し、一連の if 式と同様に動作します。
この例では、Verse プログラムは、GuardStateVariable が alert_state に解決される場合に、expression3 を実行します。 このプログラムが patrol_state を渡すと、Verse は構造的にデフォルト ケースにジャンプし、expression5 を実行します。
case を他の制御フローで使用する
case 文のブロックでは、case 文が loop の内部にある場合、break 処理および続行を実行できます。 case 文の各ブロックに、それらを含む関数から返ることもできます。
次に例を示します。
loop:
case (x):
42 => break
_ => {}このおかしな loop では x = 42 の場合にすぐに完了するか、無限ループになります。
別の例を示します。
Foo(x : int) : int =
case (x):
100 => return 200
_ => return 100この例は以下と同等です。
Foo(x : int) : int =
case (x):
100 => 200
_ => 100これは case 文がこの関数にある最後の式であるためです。
デフォルト ケース
_=> ケース (デフォルト ケース) がない case 文は、一致するケースがない場合に、失敗します。 このような case 文を失敗コンテキスト (decides エフェクトがある関数など) で使用するのは、問題ありません。
列挙したすべてのケースに一致する case 文は、_=> ケースがない場合でも、失敗しません。