Перечислить использование двойной точки (.) В дротике?

144

Иногда я вижу это List list = [];

затем list..add(color)

В чем разница в использовании 1 точки ( .) и 2 точек ( ..)?

Даниэль Мана
источник

Ответы:

251

..называется каскадной нотацией . Это позволяет вам не повторять одну и ту же цель, если вы хотите вызвать несколько методов для одного и того же объекта.

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);
Александр Ардуин
источник
79

Это каскадный оператор Dart

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

приводит l1к списку[0, 1, 2, 3]

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

приводит к ошибке, потому что .add(0)возвращаетvoid

..(в предыдущем примере) относится к new List(), а .(в последнем) относится к возвращаемому значению предыдущей части выражения.

..был введен, чтобы избежать необходимости возвращаться thisво всех видах методов, например, add()чтобы иметь возможность свободно использовать API.

.. предоставляет это из коробки для всех классов.

Гюнтер Цохбауэр
источник
Ссылаясь на то .. (in former example) refers to new List(), вы имеете в виду, что мы снова создаем новый, Listкогда мы используем, ..на мой взгляд, НЕТ. Меня смутило ваше newслово, действительно ли оно НОВОЕ или вы здесь про newключевое слово.
CopsOnRoad 07
Первое newтеперь необязательно. ..относится к списку, возвращаемому функцией, new List<int>()и позволяет вызывать для него несколько методов, например, add(0) addAll(...)без повторения, l1.и назначается созданный экземпляр списка l1, а не возвращаемое значение последнего метода в цепочке ( addAll(...)). Отвечает ли это на ваш вопрос?
Гюнтер Цохбауэр
1
Абсолютно! Я знаю, newчто начинать с Dart 2.0 необязательно, я просто запутался newв приведенном выше контексте и спасибо за ваше объяснение.
CopsOnRoad 07
1
..add(6)нравится l1.add(6), .add(6)нравится l1.add(5).add(6). add(5)возвращается , voidи вы не можете позвонить add()поvoid
Гюнтер Zöchbauer
2
следуйте этому документу: - dartlang.org/guides/language/language-tour#cascade-notation- Строго говоря, обозначение «двойной точки» для каскадов не является оператором. Это просто часть синтаксиса Dart.
Mr Special
19

Каскады (..) позволяют выполнять последовательность операций над одним и тем же объектом. подробности читайте в документе

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

Предыдущий пример эквивалентен:

var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
Мо Шон
источник
1
спасибо за этот пример! есть идеи, почему ..onClickне переводится button.classes.onClick?
Bouke Versteegh,
Спасибо за использование заданий в ваших примерах. Будучи новичком в Dart, я немного читал о нотации с двумя точками, но подумал, что это просто для связывания методов void.
Кейт, округ Колумбия,
1

..В dart известен как каскадный оператор .

Это позволяет вам использовать более одной операции подпоследовательности:

Примеры:

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

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

Вот еще один пример

Вот еще один пример

Раушан Джа
источник