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 ($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 语句:

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 语句已经在那里。