341 votes

Énumérer l'utilisation du double point (.) dans les fléchettes ?

Parfois, je vois ceci List list = [];

Dans ce cas list..add(color)

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

535voto

Alexandre Ardhuin Points 16297

.. est connu sous le nom de notation en cascade . Il permet de ne pas répéter la même cible si l'on veut 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);

9 votes

Il s'agit simplement de clarifier ce point, car je n'ai pas compris et j'ai itéré plusieurs fois avant de saisir le concept : Il existe deux variantes de l'opérateur de cascade au moment où j'écris ces lignes. A savoir ... et ... ? Ne pas confondre avec ... et ... ? qui sont différents et s'appellent l'opérateur de propagation dans Dart. Alors que l'opérateur de propagation ... et ... ? est destiné aux listes/collections, l'opérateur de cascade ... et ... ? peut être appelé sur n'importe quel type d'objet, et pas seulement sur une liste. (L'exemple de code ci-dessus utilise une liste mais pourrait utiliser un autre objet comme un contrôleur par exemple). De plus, spread et cascade font des choses totalement différentes.

164voto

Günter Zöchbauer Points 21340

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

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

résultats en l1 étant une liste [0, 1, 2, 3]

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

résultats une erreur, car .add(0) retours void

.. (dans l'exemple précédent) désigne new List(), alors qu' . (au plus tard) se réfère à la valeur de retour de la partie précédente de l'expression.

.. a été instaurée pour éviter la nécessité de revenir this dans toutes sortes de méthodes comme l' add() à être en mesure d'utiliser une API dans un fluide manière.

.. offre ce de la boîte pour toutes les classes.

0 votes

Renvoi .. (in former example) refers to new List() Vous voulez dire que nous créons à nouveau une nouvelle List lorsque nous utilisons .. A mon avis, NON. J'ai été dérouté par votre new mot, est-ce que c'est vraiment NEW ou est-ce que vous parlez de new mot-clé ici.

0 votes

Première new est désormais facultatif. .. fait référence à la liste renvoyée par new List<int>() et permet d'appeler plusieurs méthodes comme add(0) addAll(...) sans répéter l1. et c'est l'instance de liste créée qui est assignée à l1 , no la valeur de retour de la dernière méthode de la chaîne ( addAll(...) ). Cela répond-il à votre question ?

1 votes

Absolument ! Je sais que new est optionnel à partir de Dart 2.0, j'ai été dérouté par le fait que l'option new dans le contexte ci-dessus et merci pour votre explication.

45voto

mohsin azeem Points 504

Les cascades (..) permettent d'effectuer une séquence d'opérations sur le même objet. Lire le document 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 est équivalent à :

var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));

1 votes

Merci pour cet exemple ! Une idée de la raison ? ..onClick ne se traduit pas par button.classes.onClick ?

0 votes

Merci d'avoir utilisé les affectations dans vos exemples. Étant nouveau dans Dart, j'ai lu un peu sur la notation à double point, mais je pensais que c'était juste pour enchaîner des méthodes void.

8voto

Raushan Jha Points 71

.. Est connu sous le nom de opérateur en cascade en fléchette.

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

Here is another example

6voto

Paresh Mangukiya Points 13942

Cascade dans Dart Parce que les développeurs Dart utilisent beaucoup l'enchaînement de méthodes, la fonction de cascade est fournie pour les soutenir.

Voir le code suivant :

class Calculator {
  double _accumulator = 0;

  Calculator(double startValue) {
    this._accumulator = startValue;
  }

  void add(double val) {
    this._accumulator += val;
  }

  void subtract(double val) {
    this._accumulator -= val;
  }

  double result() {
    return this._accumulator;
  }
}

C'est presque la même chose que ChainCalculator à une seule différence près, à savoir que return this a été supprimée dans chaque méthode.

Utilisons la fonction de cascade.

Calculator calculator = Calculator(0.0)
    ..add(12.0)
    ..subtract(10.0)
    ..add(5.0)..subtract(8.0);

print("Result: " + calculator.result().toString());

Il fonctionne parfaitement et est similaire au code précédent, mais au lieu de . la notation, les utilisations en cascade .. (double point) pour accéder à l'instance de modification en cours.

Pourquoi une cascade dans Dart ?

D'une manière générale, la cascade est très utile pour :

construction d'objets complexes (configuration de nombreuses propriétés) améliorer les objets pour l'encapsulation. return this rend les objets trop ouverts. construire des objets plus rapidement avec la cascade imbriquée. moins de lignes de code.

il est extrait de : Enchaînement de méthodes à l'aide de Cascade dans Dart

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X