【发布时间】:2018-09-02 00:24:21
【问题描述】:
有时我会看到这个
List list = [];
然后list..add(color)
使用 1 点 (.) 和 2 点 (..) 有什么区别?
【问题讨论】:
标签: dart
有时我会看到这个
List list = [];
然后list..add(color)
使用 1 点 (.) 和 2 点 (..) 有什么区别?
【问题讨论】:
标签: dart
.. 被称为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 的级联运算符
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<int>() 返回的列表,并允许在其上调用多个方法,如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()
级联 (..) 允许您对同一对象进行一系列操作。 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 中的级联 由于 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使对象过于开放。 使用嵌套级联更快地构建对象。 更少的代码行数。
【讨论】:
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());
}
【讨论】: