d非常奇怪的case
原文
:如果可在静每一中放case,就应该可放else if.
这不是"对普通模式不适合",而是"非常奇怪".case语句工作方式更像是goto标签,而不是语句.如,以下是有效代码:
import std.stdio;
void switchtest(int i, bool b)
{
switch (i)
{
case 1:
if (b)
{
case 2:
writefln!"是1b还是2: %s, %s"(i, b);
return;
}
break;
default: break;
}
assert(false);
}
void main()
{
switchtest(1, true);
switchtest(2, false);
}
解释下:
if/else的语法树是:
if (EXPRESSION) STATEMENT [else STATEMENT]
static foreach不匹配else,所以不解析.
switch/case的语法树不是你想的:
switch (EXPRESSION) { [case EXPRESSION: STATEMENT*]* }.
而是:
switch (EXPRESSION) STATEMENT
STATEMENT = ... | CASE_STATEMENT
CASE_STATEMENT = case EXPRESSION:
而是在语义阶段,而非语法阶段,验证CASE_STATEMENT出现在switch中,而没有其它位置限制.
这是static foreach工作的唯一原因.
浙公网安备 33010602011771号