Dart 展开运算符

Spread operators 展开运算符 ......?

对一个集合表达式求值,将集合内所有元素解包取出,插入到另一个集合字面量(列表、Set、Map)中

不属于运算符表达式,......? 并不是传统意义上的运算符,也属于语法糖

分两种

...collection:普通展开,要求集合一定不为 null;传入 null 直接报错

...?collection:空安全展开,若集合为 null,直接忽略,不抛出异常

看例子,就很容易明白,这是官方提供的例子

void main() {
  final list1 = [1, 2, 3];
  final list2 = [0, ...list1, 4, 5];
  print(list2); // [0, 1, 2, 3, 4, 5]

  // 空安全展开
  List<int>? maybeList;
  final safeList = [10, ...?maybeList, 20];
  print(safeList); // [10, 20],maybeList 为 null 不报错
}Code language: Dart (dart)

上面是两个集合,第一个集合是1 2 3 三个元素,第二个集合把第一个集合 插入到0的后面,然后后面再插入了 4 5 最后编程了 0 1 2 3 4 5

第二个,也是插入,但是由于maybeList是null,并且用到的是空安全展开。所以最终不影响结果,只是不会插入,而且也不会报错。

set的例子

void main() {
	final set1 = {1, 2};
	final set2 = {3, ...set1, 4};
	print(set2); // {3, 1, 2, 4}
}Code language: PHP (php)

Map例子

void main() {
	final map1 = {'a': 1, 'b': 2};
	final map2 = {'c': 3, ...map1, 'd': 4};
	print(map2); // {c: 3, a: 1, b: 2, d: 4}
}Code language: PHP (php)

注意

不能脱离 [] {} 单独使用 ...

void main() {
    final list1 = [1, 2, 3];
	var arr = ...list; // 语法错误,只能写在集合字面量内部
}Code language: PHP (php)
D:\dartdemo\firstdart>dart run
Building package executable...
Failed to build firstdart:firstdart:
bin/firstdart.dart:3:12: Error: Expected an identifier, but got '...'.
Try inserting an identifier before '...'.
        var arr = ...list; // 语法错误,只能写在集合字面量内部
                  ^^^
bin/firstdart.dart:3:12: Error: Expected ';' after this.
        var arr = ...list; // 语法错误,只能写在集合字面量内部
                  ^^^
bin/firstdart.dart:3:15: Error: Undefined name 'list'.
        var arr = ...list; // 语法错误,只能写在集合字面量内部Code language: PHP (php)

... 直接展开 null 会运行报错,存在空值可能必须用 ...?

void main() {
	List<int>? list = null;
	var res = [...list]; // 报错
	var resSafe = [...?list]; // 正常
}Code language: PHP (php)
D:\dartdemo\firstdart>dart run
Building package executable...
Failed to build firstdart:firstdart:
bin/firstdart.dart:3:16: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
        var res = [...list]; // 报错Code language: PHP (php)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注