Lister l'utilisation du double point (.) Dans la fléchette?

142

Parfois je vois ça List list = [];

ensuite list..add(color)

Quelle est la différence entre l'utilisation de 1 point ( .) et 2 points ( ..)?

Daniel Mana
la source

Réponses:

243

..est connue sous le nom de notation en cascade . Il vous permet de ne pas répéter la même cible si vous souhaitez appeler plusieurs méthodes sur le même objet.

List list = [];
list.add(color1);
list.add(color2);
list.add(color3);
list.add(color4);

// with cascade

List list = [];
list
  ..add(color1)
  ..add(color2)
  ..add(color3)
  ..add(color4);
Alexandre Ardhuin
la source
77

C'est l'opérateur en cascade de Dart

var l1 = new List<int>()..add(0)..addAll([1, 2, 3]);

résulte en l1une liste[0, 1, 2, 3]

var l1 = new List<int>().add(0).addAll([1, 2, 3]);

entraîne une erreur, car .add(0)renvoievoid

..(dans le premier exemple) fait référence à new List(), tandis que .(dans le dernier) fait référence à la valeur de retour de la partie précédente de l'expression.

..a été introduit pour éviter le besoin de revenir thisdans toutes sortes de méthodes, comme add()pouvoir utiliser une API de manière fluide.

.. fournit ceci hors de la boîte pour toutes les classes.

Günter Zöchbauer
la source
En .. (in former example) refers to new List()vous référant , voulez-vous dire que nous créons à nouveau un nouveau Listlorsque nous utilisons ..à mon avis NON. Je suis confus par votre newmot, est-ce vraiment NOUVEAU ou vous parlez de newmot-clé ici.
CopsOnRoad
Le premier newest désormais facultatif. ..fait référence à la liste retournée par new List<int>()et permet d'appeler plusieurs méthodes dessus comme add(0) addAll(...)sans répétition l1.et c'est l'instance de liste créée qui est assignée l1, pas la valeur de retour de la dernière méthode dans la chaîne ( addAll(...)). Est-ce que cela répond à votre question?
Günter Zöchbauer
1
Absolument! Je sais que newc'est facultatif à partir de Dart 2.0, je viens d'être confus par le newcontexte ci-dessus et merci pour votre explication.
CopsOnRoad
1
..add(6)est comme l1.add(6), .add(6)est comme l1.add(5).add(6). add(5)retours voidet vous ne pouvez pas appeler add()levoid
Günter Zöchbauer
2
suivez ce document: - dartlang.org/guides/language/language-tour#cascade-notation- À proprement parler, la notation «double point» pour les cascades n'est pas un opérateur. Cela fait juste partie de la syntaxe Dart.
Mr Special
17

Les cascades (..) vous permettent de faire une séquence d'opérations sur le même objet. lire la doc pour plus de détails

querySelector('#confirm') // Get an object.
  ..text = 'Confirm' // Use its members.
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'));

L'exemple précédent équivaut à:

var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
mo sean
la source
1
merci pour cet exemple! une idée pourquoi ..onClickne se traduit pas button.classes.onClick?
Bouke Versteegh le
1

..Est connu comme l' opérateur en cascade dans Dart.

Il vous permet d'utiliser plus d'une opération de sous-séquence:

Exemples:

banerad..load()..show().

List coursename;
coursename..add("java")..add("flutter" )..add("dart");

Voici un autre exemple

Voici un autre exemple

Raushan Jha
la source