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