Liste Verwendung von Doppelpunkt (.) In Dart?

141

Manchmal sehe ich das List list = [];

Dann list..add(color)

Was ist der Unterschied bei der Verwendung von 1 Punkt ( .) und 2 Punkt ( ..)?

Daniel Mana
quelle

Antworten:

239

..ist als Kaskadenschreibweise bekannt . Sie können nicht dasselbe Ziel wiederholen, wenn Sie mehrere Methoden für dasselbe Objekt aufrufen möchten.

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
quelle
74

Es ist der Kaskadenbetreiber von Dart

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

führt l1zu einer Liste[0, 1, 2, 3]

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

führt zu einem Fehler, da .add(0)zurückgegeben wirdvoid

..(im ersteren Beispiel) bezieht sich auf new List(), während .(im späteren Beispiel) auf den Rückgabewert des vorherigen Teils des Ausdrucks verweist.

..wurde eingeführt, um die Notwendigkeit zu vermeiden, thisauf alle Arten von Methoden zurückzukehren add(), um eine API auf flüssige Weise verwenden zu können.

.. bietet dies sofort für alle Klassen an.

Günter Zöchbauer
quelle
Meinst .. (in former example) refers to new List()du, wir schaffen wieder eine neue, Listwenn wir ..meiner Meinung nach NEIN verwenden? Ihr newWort hat mich verwirrt , ist es wirklich NEU oder Sie sprechen hier über ein newSchlüsselwort.
CopsOnRoad
Erstens newist jetzt optional. ..bezieht sich auf die von zurückgegebene Liste new List<int>()und ermöglicht das Aufrufen mehrerer Methoden wie add(0) addAll(...)ohne Wiederholung. l1.Es wird die erstellte Listeninstanz zugewiesen l1, nicht der Rückgabewert der letzten Methode in der Kette ( addAll(...)). Beantwortet das deine Frage?
Günter Zöchbauer
1
Absolut! Ich weiß, dass newes ab Dart 2.0 optional ist. Ich bin gerade durch den newobigen Kontext verwirrt worden und danke für Ihre Erklärung.
CopsOnRoad
1
..add(6)ist wie l1.add(6), .add(6)ist wie l1.add(5).add(6). add(5)Erträge voidund man kann nicht rufen add()anvoid
Günter Zöchbauer
2
Befolgen Sie dieses Dokument: - dartlang.org/guides/language/language-tour#cascade-notation- Genau genommen ist die "Doppelpunkt" -Notation für Kaskaden kein Operator. Es ist nur ein Teil der Dart-Syntax.
Mr Special
17

Mit Kaskaden (..) können Sie eine Folge von Operationen für dasselbe Objekt ausführen. Lesen Sie das Dokument für Details

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

Das vorherige Beispiel entspricht:

var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
mo sean
quelle
1
danke für dieses beispiel! Irgendeine Idee, warum ..onClicknicht übersetzt button.classes.onClick?
Bouke Versteegh
1

..Ist als Kaskadenoperator in Dart bekannt.

Sie können mehr als eine Teilsequenzoperation verwenden:

Beispiele:

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

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

Hier ist ein weiteres Beispiel

Hier ist ein weiteres Beispiel

Raushan Jha
quelle