Wymień użycie podwójnej kropki (.) W rzutce?

163

Czasami to widzę List list = [];

Następnie list..add(color)

Jaka jest różnica w używaniu 1 kropki ( .) i 2 kropek ( ..)?

Daniel Mana
źródło

Odpowiedzi:

274

..jest znany jako notacja kaskadowa . Pozwala nie powtarzać tego samego celu, jeśli chcesz wywołać kilka metod na tym samym obiekcie.

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
źródło
88

To operator kaskady Darta

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

powoduje, l1że jest listą[0, 1, 2, 3]

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

powoduje błąd, ponieważ .add(0)zwracavoid

..(w poprzednim przykładzie) odnosi się do new List(), podczas gdy .(w późniejszym) odnosi się do wartości zwracanej z poprzedniej części wyrażenia.

..został wprowadzony, aby uniknąć konieczności powracania thiswe wszelkiego rodzaju metodach, takich jak add()płynne korzystanie z interfejsu API.

.. zapewnia to po wyjęciu z pudełka dla wszystkich klas.

Günter Zöchbauer
źródło
Odnosząc się .. (in former example) refers to new List(), czy masz na myśli, że ponownie tworzymy nowy, Listkiedy używamy ..moim zdaniem NIE. Zmyliło mnie Twoje newsłowo, czy to naprawdę NOWE, czy też mówisz newtutaj o słowie kluczowym.
CopsOnRoad
Pierwsza newjest teraz opcjonalna. ..odwołuje się do listy zwróconej przez new List<int>()i pozwala na wywołanie wielu metod na niej add(0) addAll(...)bez powtarzania l1.i to jest przypisana do utworzonej instancji listy l1, a nie wartość zwracana przez ostatnią metodę w łańcuchu ( addAll(...)). Czy to odpowiada na twoje pytanie?
Günter Zöchbauer
1
Absolutnie! Wiem, że newjest to opcjonalne, począwszy od Dart 2.0, właśnie pomyliłem się neww powyższym kontekście i dziękuję za wyjaśnienie.
CopsOnRoad
1
..add(6)jest jak l1.add(6), .add(6)jest jak l1.add(5).add(6). add(5)powraca voidi nie można wywołać add()navoid
Günter Zochbauer
2
postępuj zgodnie z tym dokumentem: - dartlang.org/guides/language/language-tour#cascade-notation- Ściśle mówiąc, notacja „podwójnej kropki” dla kaskad nie jest operatorem. To tylko część składni Dart.
Mr Special
20

Kaskady (..) pozwalają na wykonanie sekwencji operacji na tym samym obiekcie. przeczytaj dokument, aby uzyskać szczegółowe informacje

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

Poprzedni przykład jest równoważny z:

var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
mo sean
źródło
1
dzięki za ten przykład! każdy pomysł, dlaczego ..onClicknie przekłada się na button.classes.onClick?
Bouke Versteegh
Dziękuję za wykorzystanie zadań w przykładach. Będąc nowym w Dart, czytałem trochę o notacji z podwójną kropką, ale pomyślałem, że to tylko do łączenia metod void.
Keith DC
2

..Jest znany jako operator kaskadowy w dart.

Pozwala na użycie więcej niż jednej operacji podciągów:

Przykłady:

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

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

Oto kolejny przykład

Oto kolejny przykład

Raushan Jha
źródło
0

Kaskada w Dart Ponieważ programiści Dart intensywnie wykorzystują łańcuchy metod, do obsługi dodano funkcję kaskadowania.

Zobacz poniższy kod:

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;
  }
}

To prawie to samo, co ChainCalculatorklasa; tylko jedna różnica, gdzie return thiszostała usunięta w każdej metodzie.

Użyjmy funkcji kaskady.

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

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

Działa doskonale i podobnie jak poprzedni kod, ale zamiast .notacji kaskadowo używa notacji ..(z podwójną kropką) w celu uzyskania dostępu do bieżącej instancji modyfikującej.

Dlaczego kaskada w Dart?

Ogólnie rzecz biorąc, kaskada jest bardzo pomocna w przypadku:

budowanie złożonych obiektów (wiele konfiguracji właściwości), dzięki czemu obiekty są lepsze do hermetyzacji. return thispowoduje, że obiekty są zbyt otwarte. budowanie obiektów szybciej dzięki zagnieżdżonej kaskadzie. mniej linii kodu.

pochodzi z: Metoda łączenia łańcuchowego przy użyciu Cascade w Dart

Paresh Mangukiya
źródło