Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
方法级联在dart中究竟是如何工作的?_Dart_Method Cascades - Fatal编程技术网

方法级联在dart中究竟是如何工作的?

方法级联在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

如dart文章所述:

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

所以我认为这是可行的:

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