开关通电路中达特(Switch fallthrough in Dart)

2019-09-22 20:09发布

我开始学习今天飞镖,和我遇到我的谷歌技能都很难找到的东西。

如何在一个非空的情况下落空?

我使用的情况是这样的:我在写一个sprintf的实现(因为镖没有这个也行),这除了今年秋天穿的东西的工作。 当解析变量类型可以,例如,具有“%X”与“%X”其中大写类型告诉该输出被认为是大写格式。

半伪代码的样子:

bool is_upper = false;
switch (getType()) {
    case 'X':
      is_upper = true;
    case 'x':
      return formatHex(is_upper);
}

其他方面,我能想到这样做的,下面的一个会

1:

switch (getType()) {
  case 'X': case 'x':
    return formatHex('X' == getType());
}

2:

var type = getType();
if (type in ['x', 'X']) {
   return formatHex('X' == getType());
}

现在,第二个选择几乎看起来不错,但你要记住,有十的情况下,这意味着有11 if (type in [])这是比较,我想打字。

因此,没有镖有一些// //$FALL-THROUGH$ ,我不知道?

谢谢。

Answer 1:

达特规范给出了一个开关的情况下使用“继续”,继续到另一台交换机的情况下一种方式:

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");
}

它的工作原理在VM,但可悲的dart2js切换实现尚不支持该功能。



Answer 2:

你不能有一个非空的case在镖身了落空,这将产生一个错误。

我倾向于比非常简单其他任何东西做switch语句是出重构所有普通代码的功能,让您不必在此多级控制流量switch本身。

换句话说,是这样的:

switch (getType()) {
    case 'X':
        return formatHex(true);
    case 'x':
        return formatHex(false);
}

没有理由为什么你需要有下通。 它派上用场的时候在动作case部分可以在TOTO在另一月底进行case部分,但是这种方法可以做,没有下通,也没有留下您的switch语句复杂。

它也可以处理更复杂的情况下,有没有包含在最终TOTO共同行动。 例如,您可能希望在开始或在中间做一些事情case部分。 调用常用功能处理,除不够好更多:

switch (getType()) {
    case 'X':
        doSomethingOnlyForUpperCase();
        doSomethingCommon();
        doSomethingElseOnlyForUpperCase();
        return formatHex(true);
    case 'x':
        doSomethingCommon();
        return formatHex(false);
}

我其实也是自从我相信它有助于可读性和可维护性支持这种非空落空的语言(如C)做到这一点。



Answer 3:

从镖语言之旅 ,你的例子(2)应该是正确的。

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

这将是一个错误,如果你试图做一些事情如下

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

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

  case 'CLOSED':
    executeClose();
    break;
}


Answer 4:

此外,拉塞的回答的简化是使用一个简单的continue; 代替continue <label>; 如:

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


文章来源: Switch fallthrough in Dart