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 thiswe wszelkiego rodzaju metodach, takich jak add()płynne korzystanie z interfejsu API.
.. zapewnia to po wyjęciu z pudełka dla wszystkich klas.
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?
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.
..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
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!'));
..onClicknie 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 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
.. (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 Twojenewsłowo, czy to naprawdę NOWE, czy też mówisznewtutaj o słowie kluczowym.