方法级联在dart中究竟是如何工作的?
如dart文章所述: “.”语法调用方法(或setter或getter),但放弃结果,并返回原始接收方 所以我认为这是可行的:方法级联在dart中究竟是如何工作的?,dart,method-cascades,Dart,Method Cascades,如dart文章所述: “.”语法调用方法(或setter或getter),但放弃结果,并返回原始接收方 所以我认为这是可行的: myList..clear().addAll(其他列表); 这给了我一个错误,我不能在null上调用.addAll 显然,在之前。因此,.addAll已在.clear()的结果上被调用 我想现在我有两种可能来写这个: myList..clear()…addAll(其他列表) (myList..clear()).addAll(otherList)(如果我想得到.addA
myList..clear().addAll(其他列表);
这给了我一个错误,我不能在null
上调用.addAll
显然,
在之前。
因此,.addAll
已在.clear()
的结果上被调用
我想现在我有两种可能来写这个:
myList..clear()…addAll(其他列表)代码>
(myList..clear()).addAll(otherList)
(如果我想得到.addAll()
的结果这是正确的吗?如果是,为什么决定给予
优先权?这似乎很违反直觉。是为了避免这样的语法:myList(…clear().useResultOfClear()).addAll(otherList);
?你可以阅读Gilad Bracha的文章:。在文章的结尾,你会看到很多例子
另见:
它有助于将“.”视为一个运算符,而更像是一个作用域构造(如括号)。它从“.”到下一个“.”或第一个其他作用域分隔符(“;”、“”、“}”或类似符)创建一个新的作用域
基本上,a..b().c()
与(t){t.b().c();return t;}(a)
相同,如下所示:
“.”语法调用方法(或setter或getter),但放弃
返回结果,并返回原始接收器
简言之,方法级联为各种情况提供了语法上的糖分
方法调用的接收者可能必须是
重复
以下是基于/复制自先前引用文章的示例。欲了解更多信息
add()
示例
在希望向列表添加多个元素的场景中,传统方法是执行多个赋值:
myList.add(“item1”);
myList.添加(“第2项”);
//一次又一次地添加…
myList.add(“itemN”);
虽然您不能执行类似于myList.add(“item1”).add(“item1”)……add(“itemN”)
由于add()
方法不会返回myList
对象,因此可以使用级联运算符,因为它会丢弃结果,并返回原始接收器myList
:
myList..add(“item1”)…add(“item2”)…add(“itemN”);
myList.add(“item1”).add(“item2”)……add(“itemN”);
另一个例子
因此,与其写:
var address=getAddress();
地址:setStreet(“Elm”,“13a”);
address.city=“迦太基”;
address.state=“欧亚大陆”
地址:zip(66666,扩展名:6666);
可以写
getAddress()
.“榆树”、“13a”)
…城市=“迦太基”
…state=“欧亚大陆”
..拉链(66666,加长:6666);
A..B().C()
表示在A
上调用B()
,然后根据A.B()
的返回值调用C()
A..B().C()…D().E()
意味着在A
上调用B()
,然后根据A.B()
的返回值调用C()
,假设它是A\u B
,然后在A\u B
上调用D()
,即A\u B.D()
,假设它的返回值是A\u\u\D
,最后执行A_B_D.E()
要对同一对象执行一系列操作,请使用级联(…)
。我们都见过这样的表达:
myObject.someMethod()
它在myObject
上调用someMethod()
,表达式的结果是someMethod()的返回值
下面是带有级联的相同表达式:
myObject..someMethod()
尽管它仍然在myObject
上调用someMethod()
,但表达式的结果不是返回值-它是对myObject
的引用!使用级联,您可以将需要单独语句的操作链接在一起。例如,考虑这个代码:
var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
使用级联,代码变得更短,您不需要按钮
变量:
querySelector('#confirm')
..text = 'Confirm'
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
代码示例
使用级联创建一条语句,将BigObject
的anInt
、aString
和aList
属性设置为1,字符串和[3.0]
(分别),然后调用allDone()
类BigObject{
int-anInt=0;
字符串aString='';
列表列表列表=[];
bool_done=false;
void allDone(){
_完成=正确;
}
}
BigObject fillBigObject(BigObject obj){
返回obj
…Anit=1
…aString='String!'
..增加(3)
…全部完成();
}
您可以在原始设计方案中看到这样的例子:您的文章不可用,我如何查阅?@FelipeSales抱歉,但我找不到这篇文章的任何痕迹,我将删除引用。好的,我的朋友:/
class BigObject {
int anInt = 0;
String aString = '';
List<double> aList = [];
bool _done = false;
void allDone() {
_done = true;
}
}
BigObject fillBigObject(BigObject obj) {
return obj
..anInt = 1
..aString = 'String!'
..aList.add(3)
..allDone();
}