方法级联如何在飞镖中正常工作?

时间:2013-06-10 14:04:48

标签: dart method-cascades

如飞镖文章所述:

  

“..”语法调用方法(或setter或getter)但丢弃结果,然后返回原始接收器。

所以我认为这样可行:

myList..clear().addAll(otherList);

给了我错误,我无法在.addAll上致电null

显然.位于..之前,因此.addAll已在.clear()结果上调用。

我现在认为我有两种可能性来写这个:

  1. myList..clear()..addAll(otherList);
  2. (myList..clear()).addAll(otherList);(如果我想获得.addAll()
  3. 的结果

    这是对的吗?如果是,为什么决定给予.优先权?这似乎非常违反直觉。是否要避免这样的语法:myList(..clear().useResultOfClear()).addAll(otherList);

4 个答案:

答案 0 :(得分:14)

正如official Dart language article Method Cascades in Dart

所指出的那样
  

“..”语法调用方法(或setter或getter)但丢弃   结果,并返回原始接收器

     

简而言之,方法级联为情境提供语法糖   否则方法调用的接收者可能必须是   重复。

以下是基于先前引用文章的示例/复制。有关详细信息,请go read it

add()示例

在想要将多个元素添加到列表的场景中, legacy-way 将执行多个分配:

myList.add("item1");
myList.add("item2");
// add again and again…
myList.add("itemN");

由于 myList.add("item1").add("item1")….add("itemN");没有方法返回add()对象but a void 而无法执行myList之类的操作,您可以使用级联运算符而不是丢弃结果,并返回原始接收者myList

myList..add("item1")..add("item2")…..add("itemN");
myList.add("item1").add("item2")….add("itemN");

另一个例子

所以不要写作:

var address = getAddress();
address.setStreet(“Elm”, “13a”);
address.city = “Carthage”;
address.state = “Eurasia”
address.zip(66666, extended: 6666);

有人可以写

getAddress()
 ..setStreet(“Elm”, “13a”)
 ..city = “Carthage”
 ..state = “Eurasia”
 ..zip(66666, extended: 6666);

进一步阅读

如果您想了解更多关于级联方法的信息,我写了article by adding information that goes behind the scope of this question

答案 1 :(得分:9)

你可以阅读Gilad Bracha的文章:Method Cascades in Dart。最后,你会看到很多例子。

另见this answer of Lasse Nielsen about operator precedence

  

有助于想到" .."虽然不是一个真正的操作员,但更像是一个范围构造(如括号)。它创建了一个新的范围来自" .."到下一个" .."或第一个其他范围分隔符(&#34 ;;",")","}&#34 ;或类似的。)

基本上,a..b().c()(t){t.b().c(); return t;}(a)

相同

答案 2 :(得分:0)

我也不喜欢官方文档,但这是我的想法,我认为它应该是官方的:

  

..表示保留先前的返回值

然后选择您的myList..clear().addAll(otherList);

  1. myList返回自身
  2. (myList)..clear()返回void
  3. (void).addAll(),这是一个错误

,或者您可以将其视为停留在先前返回的对象的作用域之内,这样就可以连续访问其字段。

答案 3 :(得分:0)

要对同一对象执行一系列操作,请使用级联 (..)。我们都见过这样的表达:

myObject.someMethod()

它在someMethod()上调用myObject,表达式的结果是someMethod()的返回值。

这是一个带有级联的相同表达式:

myObject..someMethod()

尽管它仍然在 someMethod() 上调用 myObject,但表达式的结果不是返回值——它是对 myObject 的引用!使用级联,您可以将需要单独语句的操作链接在一起。例如,考虑以下代码:

var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));

使用级联,代码变得更短,而且您不需要 button 变量:

querySelector('#confirm')
..text = 'Confirm'
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));

代码示例

使用级联创建单个语句,将 anIntaStringaListBigObject 属性设置为 1、String! 和 { {1}}(分别)然后调用 [3.0]

allDone()