Dart スプレッド演算子

Spread operators スプレッド演算子 ......?

コレクション式を評価し、コレクション内の全要素を展開・取り出し、別のコレクションリテラル(リスト、Set、Map)に挿入します

演算子式には該当せず、......? は伝統的な意味での演算子ではなく、シンタックスシュガー(糖衣構文)に分類されます

2種類に分かれます

...collection:通常展開。コレクションが必ず null でないことを要求。nullを渡すと即時エラーが発生

...?collection:Null安全展開。コレクションがnullの場合、無視され例外はスローされません

公式サンプルコードを見れば簡単に理解できます

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

  // Null安全展開
  List<int>? maybeList;
  final safeList = [10, ...?maybeList, 20];
  print(safeList); // [10, 20]、maybeListがnullでもエラーなし
}Code language: Dart (dart)

上記は2つのコレクションの例で、1つ目のコレクションは1、2、3の3要素です。2つ目のコレクションは0の後ろに1つ目のコレクションを挿入し、続けて4、5を追加することで [0, 1, 2, 3, 4, 5] となります

2番目の例も挿入処理ですが、maybeListがnullであり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を展開すると実行時エラーが発生します。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)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です