switch 文は制御式を評価し、値が制御式に適合している case 文にジャンプします。
switch (controlExp) { case value1: exp1; break; case value2: exp2; break; case value3: exp3; break; ... default: exp4; break; }
どの case 文も制御値に適合していない場合、default 文が実行されます。default 文は任意で、case 文のシーケンスのどこに記述しても構いません。
複数の case 文を使用してコードの同じブロックを実行する場合には、case 文を並べて記述します。たとえば、「a」と「A」の両方に関して switch が必要な場合、
switch ($letter) { case "a": case "A": print("Apple\n"); // Executed if "a" or "A" break; case "b": case "B": print("Banana\n"); // Executed if "b" or "B" break; }
他の言語と歴史的に同じものであるため、MEL の switch 文は少し奇妙な動作をする場合があります。case 文でエクスプレッションの末尾に break 文を記述しなければ、MEL は break 文またはブロックの末尾に到達するまで、switch ブロック内の他の文を評価し続けます。これはフォールスルーと呼ばれます。
たとえば、次の switch 文を見てみましょう。
switch ($color){ case "GREEN": do_green(); break; case "PINK": do_pink(); case "RED": do_red(); break; default: do_blue(); break; }
この文では、$color が "PINK" の場合、switch 文は case "PINK": にジャンプし、do_pink() が実行されます。その後に break 文がないため、これは予期せぬ動作に思われるかもしれませんが、フォールスルーし do_red() も実行されます。
フォールスルーはエラーの原因になりやすく、便利とは言えないため、注意してください。他の言語の switch 文に慣れていなければ、代わりに if...else if...else 文を使用した方が良いでしょう。
if ($color == "GREEN") { do_green(); } else if ($color == "PINK") { do_pink(); } else if ($color == "RED") { do_red(); } else { do_blue(); }
実際にフォールスルーの機能を使用する場合には、コードが誤りだと勘違いされないように、実行している内容をコメントに明記しておくと役に立ちます。
switch ($color){ case "GREEN": do_green(); break; case "PINK": do_pink(); // FALL THROUGH case "RED": do_red(); ...
switch 文の最後の case は switch の終わりなので、break 文は必要ありませんが、break 文を追加しておくのは良いことです。後になって switch 文に case を追加した場合に、break 文があらかじめ用意されていることになります。