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 ($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 文があらかじめ用意されていることになります。