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"); // Executed if "a" or "A" break; case "b": case "B": print("Banana"); // 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 THROUGHcase "RED": do_red();...
尽管 switch 语句的最后一个 case 无需是 break 语句,因为 switch 在其末端,但是添加一个 break 语句还是很好的主意。如果添加了更多 case 到 switch 语句,break 语句已经在那里。
,