Dart 展開運算子

Spread operators 展開運算子:......?

對集合運算式求值,將集合內所有元素解包取出,插入到另一個集合常值(List、Set、Map)之中

它不屬於運算子運算式,......? 並非傳統定義的運算子,同樣屬於語法糖

分為兩種形式

...集合:一般展開,要求集合一定不為 null;若傳入 null 會直接報錯

...?集合:空值安全展開,若集合為 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 不會報錯
}</int>Code language: Dart (dart)

上面有兩個List集合,第一個集合包含 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]; // 正常執行
}</int>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)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *