为什么这两个开关块不等价?

问题描述 投票:0回答:1
enum Foo {
  bar,
  baz,
}

仅查看这段代码,我认为它会打印

bar, baz
,然后
barr, bazz

void main() {
  final f = Foo.bar;
  switch (f) {
    case Foo.bar:
    case Foo.baz:
      print("bar, baz");
  }

  switch (f) {
    case Foo.bar:
      if (false) {
        return;
      }
    case Foo.baz:
      print("barr, bazz");
  }
}

这似乎很明显吧? if (false) 从未被调用,所以它不会返回,它将落入下一个 switch case。

但是没有。它打印

bar, baz

这两个代码块不等价的是什么?这背后的设计选择是什么以及它与其他语言相比如何。或者这只是另一个 Dart bug

更新

我测试了JS,JS按照我的想法工作。不是日期

let day;
switch (0) {
  case 0:
  if (false) {
    break;
  }
  
  case 1:
    
  case 2:
    day = "Tuesday"; // prints this
    break;
  case 3:
    day = "Wednesday";
    break;
}
flutter dart switch-statement
1个回答
0
投票

Dart 很聪明

一旦您将要执行的代码分配给某些

case
,就无需从
switch
中断,例如看以下代码:

  int x = 0;
  switch (x) {
    case 0:
      print('0');
    case 1:
      print('1');
  }

输出只是

0
1
的 case 没有被执行,执行匹配到某些 case 后就中断了 switch。

所以,对于你问题的第二个 switch 语句:

  switch (f) {
    case Foo.bar:
      if (false) {  // you have some code to do
        return;
      }
    case Foo.baz:
      print("barr, bazz");
  }

你已经指定了一些在

Foo.bar
情况下执行的代码,不管它是否是死代码,它仍然是在匹配时执行的代码。

找到匹配,但你没有做任何事情

if(false)
永远不会被执行,那么switch语句就结束了。

© www.soinside.com 2019 - 2024. All rights reserved.