列出在飞镖中使用双点(。)的情况?


141

有时候我看到这个 List list = [];

然后 list..add(color)

使用1点(.)和2点(..)有什么区别?

Answers:


240

..被称为级联表示法。如果要在同一个对象上调用多个方法,则可以不重复相同的目标。

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

75

是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(),您是说我们认为使用NO List时会再次创建新的..。您的new话让我感到困惑,是真的吗?还是您在new这里谈论关键字。
CopsOnRoad '18

首先new是可选的。..是指通过返回的列表new List<int>(),并允许在其上调用的多个方法等add(0) addAll(...)而不重复l1.,它是分配给所创建的列表的实例l1返回的最后一个方法在链(值addAll(...))。这回答了你的问题了吗?
君特Zöchbauer

1
绝对!我知道new从Dart 2.0开始是可选的new,上面的上下文让我很困惑,感谢您的解释。
CopsOnRoad '18

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语法的一部分。
特别先生

17

级联(..)允许您对同一对象执行一系列操作。阅读文档以获取详细信息

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)

1

..被称为飞镖的级联运算符

它允许您使用多个子序列操作:

例子:

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

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

这是另一个例子

这是另一个例子

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.