Opérateurs de propagation Dart

Opérateurs de propagation Spread operators ... et ...?

Évalue une expression de collection, dépaquette et extrait tous les éléments de la collection, puis les insère dans un autre littéral de collection (liste, Set, Map)

Il ne s’agit pas d’une expression d’opérateur : ... et ...? ne sont pas des opérateurs au sens traditionnel, ce sont du sucre syntaxique

Deux variantes existent

...collection : propagation classique. La collection ne doit absolument pas valoir null ; transmettre null provoque une erreur immédiate

...?collection : propagation sécurisée contre les valeurs null. Si la collection vaut null, elle est ignorée sans lever d’exception

Les exemples officiels permettent de comprendre facilement le fonctionnement

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

  // Propagation sécurisée null
  List<int>? maybeList;
  final safeList = [10, ...?maybeList, 20];
  print(safeList); // [10, 20],aucune erreur si maybeList est null
}Langage du code : Dart (dart)

Le premier exemple utilise deux collections : la première contient trois éléments 1, 2, 3. La seconde insère la première collection après la valeur 0, puis ajoute 4 et 5, ce qui donne le résultat [0, 1, 2, 3, 4, 5]

Le second cas réalise aussi une insertion, mais comme maybeList vaut null et que nous utilisons la propagation sécurisée, aucun élément n’est inséré, le résultat n’est pas altéré et aucune erreur ne survient

Exemple avec un Set

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

Exemple avec une 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}
}Langage du code : PHP (php)

Points d’attention

Il est impossible d’utiliser ... seul hors des crochets [] et accolades {}

void main() {
    final list1 = [1, 2, 3];
	var arr = ...list; // Erreur syntaxique, ne peut être écrit qu’à l’intérieur d’un littéral de collection
}Langage du code : 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; // Erreur syntaxique, ne peut être écrit qu’à l’intérieur d’un littéral de collection
                  ^^^
bin/firstdart.dart:3:12: Error: Expected ';' after this.
        var arr = ...list; // Erreur syntaxique, ne peut être écrit qu’à l’intérieur d’un littéral de collection
                  ^^^
bin/firstdart.dart:3:15: Error: Undefined name 'list'.
        var arr = ...list; // Erreur syntaxique, ne peut être écrit qu’à l’intérieur d’un littéral de collectionLangage du code : PHP (php)

Utiliser ... directement sur une valeur null provoque une erreur à l’exécution ; si une variable peut valoir null, utilisez impérativement ...?

void main() {
	List<int>? list = null;
	var res = [...list]; // Provoque une erreur
	var resSafe = [...?list]; // Fonctionne normalement
}Langage du code : 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]; // Provoque une erreurLangage du code : PHP (php)

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *