switch...case

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