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 ($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 将继续评估 switch 块中的其他表达式,直到到达 break 语句或块的末尾。这被称为贯穿。
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 无需是 break 语句,因为 switch 在其末端,但是添加一个 break 语句还是很好的主意。如果添加了更多 case 到 switch 语句,break 语句已经在那里。