如飞镖文章所述:
“..”语法调用方法(或setter或getter)但丢弃结果,然后返回原始接收器。
所以我认为这样可行:
myList..clear().addAll(otherList);
给了我错误,我无法在.addAll
上致电null
。
显然.
位于..
之前,因此.addAll
已在.clear()
的结果上调用。
我现在认为我有两种可能性来写这个:
myList..clear()..addAll(otherList);
(myList..clear()).addAll(otherList);
(如果我想获得.addAll()
。这是对的吗?如果是,为什么决定给予.
优先权?这似乎非常违反直觉。是否要避免这样的语法:myList(..clear().useResultOfClear()).addAll(otherList);
?
答案 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);
myList
返回自身(myList)..clear()
返回void
(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!'));
代码示例
使用级联创建单个语句,将 anInt
的 aString
、aList
和 BigObject
属性设置为 1、String!
和 { {1}}(分别)然后调用 [3.0]
。
allDone()