【问题标题】:List use of double dot (.) in dart?列出飞镖中双点(。)的使用?
【发布时间】:2018-09-02 00:24:21
【问题描述】:

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

然后list..add(color)

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

【问题讨论】:

    标签: dart


    【解决方案1】:

    .. 被称为cascade notation。如果你想在同一个对象上调用多个方法,它允许你不重复同一个目标。

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

    【讨论】:

    • 只是为了澄清,因为这让我感到困惑,我在掌握这个概念之前反复了几次:在撰写本文时,级联运算符有两种变体。即..和..?不要混淆......和......?它们是不同的,在 Dart 中称为扩展运算符。而传播运算符...和...?用于列表/集合,级联..和..?可以在任何类型的对象上调用,而不仅仅是列表。 (上面的示例代码使用列表,但可以使用另一个对象,例如控制器)。传播和级联也做了完全不同的事情。
    【解决方案2】:

    是 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(), 而.(在后面)指的是表达式前面部分的返回值。

    引入.. 是为了避免在add() 等各种方法中返回this 以便能够以流畅的方式使用API​​。

    .. 为所有类提供了开箱即用的功能。

    【讨论】:

    • 引用.. (in former example) refers to new List(),你的意思是说我们在使用..时再次创建一个新的List,我认为NO。我被你的new 字弄糊涂了,它真的是新的还是你在这里谈论new 关键字。
    • 第一个 new 现在是可选的。 .. 指的是由new List&lt;int&gt;() 返回的列表,并允许在其上调用多个方法,如add(0) addAll(...) 而无需重复l1.,它是分配给l1 的创建列表实例,不是 链中最后一个方法的返回值 (addAll(...))。这能回答你的问题吗?
    • 绝对!我知道 new 从 Dart 2.0 开始是可选的,我只是对上述上下文中的 new 感到困惑,感谢您的解释。
    • ..add(6) 类似于l1.add(6).add(6) 类似于l1.add(5).add(6)add(5) 返回void,你不能在void 上调用add()
    • follow this document: - dartlang.org/guides/language/language-tour#cascade-notation- 严格来说,级联的“双点”符号不是运算符。它只是 Dart 语法的一部分。
    【解决方案3】:

    级联 (..) 允许您对同一对象进行一系列操作。 read doc for details

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

    【讨论】:

    • 感谢这个例子!知道为什么 ..onClick 不能转换为 button.classes.onClick 吗?
    • 感谢您在示例中使用作业。作为 Dart 的新手,我读过一些关于双点符号的知识,但认为它只是用于链接 void 方法。
    【解决方案4】:

    .. 在 dart 中被称为 级联运算符

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

    示例:

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

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

    这是另一个例子

    【讨论】:

      【解决方案5】:

      Dart 中的级联 由于 Dart 开发人员大量使用方法链,因此提供了级联功能来支持。

      见以下代码:

      class Calculator {
        double _accumulator = 0;
      
        Calculator(double startValue) {
          this._accumulator = startValue;
        }
      
        void add(double val) {
          this._accumulator += val;
        }
      
        void subtract(double val) {
          this._accumulator -= val;
        }
      
        double result() {
          return this._accumulator;
        }
      }
      

      几乎和ChainCalculator类一样;只有一个区别,每个方法中都删除了return this

      让我们使用级联功能。

      Calculator calculator = Calculator(0.0)
          ..add(12.0)
          ..subtract(10.0)
          ..add(5.0)..subtract(8.0);
      
      print("Result: " + calculator.result().toString());
      

      它完美地工作并且与之前的代码相似,但不是. 表示法,cascade 使用..(双点)表示法来访问当前的修​​改实例。

      为什么要在 Dart 中级联?

      一般来说,级联对以下情况非常有帮助:

      构建复杂的对象(大量的属性配置) 使对象更好地封装。 return this 使对象过于开放。 使用嵌套级联更快地构建对象。 更少的代码行数。

      取自:Method chaining using Cascade in Dart

      【讨论】:

        【解决方案6】:
        import 'dart:io';
        
        class ChainCalculator
           
        
         {
          double _accumulator = 0.0;
        
          ChainCalculator(double initVal) {
            this._accumulator = initVal;
          }
        
          ChainCalculator add(double val) {
            this._accumulator += val;
            return this;
          }
        
          ChainCalculator subtract(double val) {
            this._accumulator -= val;
            return this;
          }
        
            enter code here
        
          double result() {
            return this._accumulator;
          }
        }
        
        class Calculator {
          double _accumulator = 0.0;
        
          Calculator(double initVal) {
            this._accumulator = initVal;
          }
        
          void add(double val) {
            this._accumulator += val;
          }
        
          void subtract(double val) {
            this._accumulator -= val;
          }
        
          double result() {
            return this._accumulator;
          }
        }
        
        void main() {
          ChainCalculator chainCalculator = ChainCalculator(0.0)
                                              .add(2.0)
                                              .subtract(1.0)
                                              .add(10.0)
                                              .subtract(2.0);
          print("[ChainCalculator] Result = " + chainCalculator.result().toString());
        
          Calculator calculator = Calculator(0.0)
                                    ..add(2.0)
                                    ..subtract(1.0)
                                    ..add(10.0)
                                    ..subtract(2.0);
        
          print("[Calculator] Result = " + calculator.result().toString());
        }
        

        【讨论】:

          猜你喜欢
          • 2022-11-02
          • 1970-01-01
          • 2018-10-15
          • 1970-01-01
          • 1970-01-01
          • 2021-05-26
          • 2019-03-11
          • 1970-01-01
          相关资源
          最近更新 更多