Czasami to widzę
List list = [];
Następnie list..add(color)
Jaka jest różnica w używaniu 1 kropki ( .
) i 2 kropek ( ..
)?
Czasami to widzę
List list = [];
Następnie list..add(color)
Jaka jest różnica w używaniu 1 kropki ( .
) i 2 kropek ( ..
)?
Odpowiedzi:
..
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);
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 this
we wszelkiego rodzaju metodach, takich jak add()
płynne korzystanie z interfejsu API.
..
zapewnia to po wyjęciu z pudełka dla wszystkich klas.
new
jest 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?
new
jest to opcjonalne, począwszy od Dart 2.0, właśnie pomyliłem się new
w powyższym kontekście i dziękuję za wyjaśnienie.
..add(6)
jest jak l1.add(6)
, .add(6)
jest jak l1.add(5).add(6)
. add(5)
powraca void
i nie można wywołać add()
navoid
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!'));
..onClick
nie przekłada się na button.classes.onClick
?
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 ChainCalculator
klasa; tylko jedna różnica, gdzie return this
został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 this
powoduje, ż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
.. (in former example) refers to new List()
, czy masz na myśli, że ponownie tworzymy nowy,List
kiedy używamy..
moim zdaniem NIE. Zmyliło mnie Twojenew
słowo, czy to naprawdę NOWE, czy też mówisznew
tutaj o słowie kluczowym.