在Dart中切换

Nad*_*seo 5 switch-statement fall-through dart

我今天开始学习Dart,而且我遇到了一些谷歌技能难以找到的东西.

如何在非空案例中进行翻版?

我的用例是这样的:我正在写一个sprintf实现(因为dart也没有这个),除了这个落空的东西之外它会工作.例如,在解析变量类型时,您可以使用"%x"与"%X",其中大写类型告诉格式化程序输出应该是大写的.

半伪代码看起来像:

bool is_upper = false;
switch (getType()) {
    case 'X':
      is_upper = true;
    case 'x':
      return formatHex(is_upper);
}
Run Code Online (Sandbox Code Playgroud)

我可以想到的其他方式,将是以下之一

1:

switch (getType()) {
  case 'X': case 'x':
    return formatHex('X' == getType());
}
Run Code Online (Sandbox Code Playgroud)

2:

var type = getType();
if (type in ['x', 'X']) {
   return formatHex('X' == getType());
}
Run Code Online (Sandbox Code Playgroud)

现在,第二个选择几乎看起来不错,但是你必须记住,有11个案例,这意味着有11个if (type in []),这是我想要的更多打字.

那么,飞镖有一些// //$FALL-THROUGH$我不知道的吗?

谢谢.

小智 8

Dart规范提供了一种使用“ continue”使开关盒继续到另一个开关盒的方法:

switch (x) {
  case 42: print("hello");
           continue world;
  case 37: print("goodbye");
           break;
  world:  // This is a label on the switch case.
  case 87: print("world");
}
Run Code Online (Sandbox Code Playgroud)

它可以在VM中运行,但是遗憾的是dart2js开关实现尚不支持该功能。


ada*_*ger 6

飞镖语言之旅中,您的(2)示例应该是正确的。

var command = 'CLOSED';
switch (command) {
  case 'CLOSED':     // Empty case falls through.
  case 'NOW_CLOSED':
    // Runs for both CLOSED and NOW_CLOSED.
    executeClose();
    break;
}
Run Code Online (Sandbox Code Playgroud)

如果您尝试执行以下操作,则会出错

var command = 'OPEN';
switch (command) {

  case 'OPEN':
    executeOpen();
    // ERROR: Missing break causes an exception to be thrown!!

  case 'CLOSED':
    executeClose();
    break;
}
Run Code Online (Sandbox Code Playgroud)


sta*_*anm 6

编辑:这似乎只是由于 Dart 实现中的错误而起作用。请参阅Dart 1.x 语言规范,“17.15 继续”部分。

该错误现已修复,如评论中所述,因此不再有效。由于历史原因保留。


此外,Lasse 答案的简化是使用简单continue;而不是continue <label>;

bool is_upper = false;
switch (getType()) {
    case 'X':
      is_upper = true;
      continue;
    case 'x':
      return formatHex(is_upper);
}
Run Code Online (Sandbox Code Playgroud)

  • 我尝试了 2021 年 8 月的版本 2.13.4,并收到编译器关于 continue without a label 的投诉。 (2认同)