下面是一个带有Switch语句的简单DART程序.

void main() {
  var list = [1, 2];
  var set = <int>{1, 2};
  var map = <int, int> {1: 2, 3: 4};
   
  switch (list) {
    case 1:
      print(1);
      break;
    case [1, 2]:
      print(2);
      break;
    case const <int> {1, 2}:
      print(3);
      break;
    case <int, int>{1: 2, 3: 4}:
      print(4);
      break;
  }
}

正如我在DART Lang中所理解的,switch语句并不是针对每个 case 判断==,而是进行模式匹配.

在上面的代码中,当表达式为switch(list)时,控制台打印2.当它为switch(set)时,控制台不打印任何内容,而对于switch(map),控制台打印4.

问题:

  1. 为什么当表达式为switch(set)时,switch 不打印3
  2. 为什么Set需要const,而ListMap不需要? 如果在设置的情况下删除const,我会收到一条错误消息:

常量模式的表达式必须是有效的常量.

推荐答案

DART支持以下类型的模式:

请注意,ListMap都有内置填充图案类型,而Set没有.

然而,有一个恒定的模式,允许case const <int> {1, 2}:.

还要考虑一下这一点:

void main() {
  print(const <int> {1, 2} == <int> {1, 2}); // false
  print(const <int> {1, 2} == const <int> {1, 2}); // true
}

因此,考虑到这一点,请注意以下几点:

void main() {
  var list = [1, 2];
  var set = const <int>{1, 2}; // add const
  var map = <int, int> {1: 2, 3: 4};
   
  switch (set) {
    case 1:
      print(1);
      break;
    case [1, 2]:
      print(2);
      break;
    case const <int> {1, 2}:
      print(3);
      break;
    case <int, int>{1: 2, 3: 4}:
      print(4);
      break;
  }
}

打印3张.

Dart相关问答推荐

如何找到这个Currate函数的返回类型?

有没有办法在用户停止输入后发送请求?

如何防止多行文本小部件放置在行中时被剪裁?

我可以动态应用 Dart 的字符串插值吗?

在 Dart 中,List.unmodifiable() 和 UnmodifiableListView 有什么不同?

如何在 Flutter Web 中使用 Skia/CanvasKit?

异常:在Flatter项目上没有Linux桌面项目配置错误

Dart VM 的性能与 Node.js 相比如何?

如何在 Flutter DropDown 按钮中搜索

在调试和生产模式之间切换

通常由 TextField 创建的 InputDecorator 不能具有无限宽度

如何从Flatter应用程序中导航到网页?(OAuth)

在字符串中查找字母 (charAt)

如何平移和zoom 图像?

GestureDetector onTap 卡

如何创建类型别名

为什么不推荐使用 context2d.backingStorePixelRatio?

Dart - 如何在每次测试之后或之前运行函数?

在 Dart 中,你能不能从一个构造函数中调用另一个构造函数

如何删除dart列表中的重复项? list.distinct()?