Dart/Flutter中的Tear off "分离"
更新时间:2023-10-29 22:02
首先引用dart文档中的定义:
如果定义看起来很复杂,让我尝试用其他词来表达。 基本上, tear-off 是一种直接使用函数作为参数而不使用任何不必要的 lambda(匿名函数)的机制。
改为:
另外一种应用:
这就是Dart中"tear off"的一个典型用例,即把一个方法或函数从其源对象中分离出来,并保存在一个变量中单独使用。
以变量的形式存储类的方法或函数,然后可以作为参数来使用或者在其他地方调用。这就像是把方法从它的类或者对象中“分离”出来,从而可以单独地处理和使用。
当您引用函数、方法或命名构造函数但省略 括号中,Dart 创建了一个 ‘ tear-off ’ 一个接受与函数相同的参数并在你调用它时调用底层函数的闭包。如果你只需要一个接受与闭包相同参数的命名函数的闭包,不要手动地将调用包装在lambda(匿名函数)中。
如果定义看起来很复杂,让我尝试用其他词来表达。 基本上, tear-off 是一种直接使用函数作为参数而不使用任何不必要的 lambda(匿名函数)的机制。
举个栗子:
var charCodes = [68, 97, 114, 116];
var buffer = StringBuffer();
// Function:
charCodes.forEach((code) {
print(code);
});
// Method:
charCodes.forEach((code) {
buffer.write(code);
});
// Named constructor:
var strings = charCodes.map((code) => String.fromCharCode(code));
// Unnamed constructor:
var buffers = charCodes.map((code) => StringBuffer(code));
改为
var charCodes = [68, 97, 114, 116];
var buffer = StringBuffer();
// Function:
charCodes.forEach(print);
// Method:
charCodes.forEach(buffer.write);
// Named constructor:
var strings = charCodes.map(String.fromCharCode);
// Unnamed constructor:
var buffers = charCodes.map(StringBuffer.new);
从Dart≥2.15开始,Class构造函数也支持tear-off 改为:
Future<void> main() async {
final testManager = TestManager(Test.fromName);
}
另外一种应用:
class Adder {
int add(int a, int b) {
return a + b;
}
}
void main() {
var adder = Adder();
var addMethod = adder.add;
print(addMethod(10, 20));
print(adder.add.call(10,20));
}
在这个示例中,我们首先创建了一个名为 Adder 的类,该类有一个 add 方法可以将两个数相加。然后,在 main 函数中,我们创建了一个 Adder 对象,并将其 add 方法存储在 addMethod 变量中。这就把 add 方法从 adder 对象中"分离"出来,之后你可以像普通函数一样使用 addMethod。这就是Dart中"tear off"的一个典型用例,即把一个方法或函数从其源对象中分离出来,并保存在一个变量中单独使用。
总结:
tear-off 基本上是一种使我们能够灵活地编写更少代码的方法。 因此,一旦您看到此 lint 错误(如果启用了 lint),只需使用 tear-off 来缩短代码。以变量的形式存储类的方法或函数,然后可以作为参数来使用或者在其他地方调用。这就像是把方法从它的类或者对象中“分离”出来,从而可以单独地处理和使用。