Dart Spread-Operatoren

Spread-Operatoren Spread operators ... und ...?

Wertet einen Collection-Ausdruck aus, entpackt alle Elemente der Sammlung vollständig und fügt sie in ein anderes Collection-Literal (Liste, Set, Map) ein

Sie zählen nicht zu den Operatorausdrücken: ... und ...? sind keine Operatoren im herkömmlichen Sinne, sondern syntaktischer Zucker

Es gibt zwei Varianten

...collection: Normales Spread. Die Sammlung darf niemals null sein; bei Übergabe von null wird sofort ein Fehler ausgelöst

...?collection: Null-sicheres Spread. Ist die Sammlung null, wird sie einfach ignoriert, es wird keine Exception geworfen

Die offiziellen Beispiele machen die Funktionsweise leicht verständlich

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

  // Null-sicheres Spread
  List<int>? maybeList;
  final safeList = [10, ...?maybeList, 20];
  print(safeList); // [10, 20], kein Fehler wenn maybeList null ist
}Code-Sprache: Dart (dart)

Das obige Beispiel zeigt zwei Sammlungen: Die erste enthält die drei Elemente 1, 2, 3. Bei der zweiten Sammlung wird die erste hinter der Zahl 0 eingefügt, anschließend folgen 4 und 5 – das Ergebnis lautet [0, 1, 2, 3, 4, 5]

Das zweite Beispiel funktioniert ebenfalls mit Einfügen, aber da maybeList null ist und der null-sichere Spread verwendet wird, werden keine Elemente eingefügt, das Ergebnis bleibt unverändert und es entsteht kein Fehler

Beispiel mit Set

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

Beispiel mit 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-Sprache: PHP (php)

Wichtige Hinweise

... darf nicht einzeln außerhalb von [] und {} verwendet werden

void main() {
    final list1 = [1, 2, 3];
	var arr = ...list; // Syntaxfehler, nur innerhalb eines Collection-Literals erlaubt
}Code-Sprache: 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; // Syntaxfehler, nur innerhalb eines Collection-Literals erlaubt
                  ^^^
bin/firstdart.dart:3:12: Error: Expected ';' after this.
        var arr = ...list; // Syntaxfehler, nur innerhalb eines Collection-Literals erlaubt
                  ^^^
bin/firstdart.dart:3:15: Error: Undefined name 'list'.
        var arr = ...list; // Syntaxfehler, nur innerhalb eines Collection-Literals erlaubtCode-Sprache: PHP (php)

Wird ... direkt auf einen null-Wert angewendet, kommt es zu einem Laufzeitfehler. Bei möglichen null-Werten muss stets ...? genutzt werden

void main() {
	List<int>? list = null;
	var res = [...list]; // Löst einen Fehler aus
	var resSafe = [...?list]; // Funktioniert problemlos
}Code-Sprache: 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]; // Löst einen Fehler ausCode-Sprache: PHP (php)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert