我正在阅读有关的文档Isolate.spawn<T> https://api.dart.dev/stable/2.13.4/dart-isolate/Isolate/spawn.html,并且它提到了“实例方法撕裂”。我不知道那是什么,也找不到其他地方的解释。什么是撕扯?
该函数必须是一个顶级函数或静态方法,可以使用单个参数调用,即一个编译时常量函数值,它接受至少一个位置参数,并且最多有一个必需的位置参数。该函数可以接受任意数量的可选参数,只要它可以仅使用一个参数来调用。该函数不能是函数表达式或函数的值实例方法撕裂。
在这个 github 问题中也大量使用了它:支持方法/函数重载 https://github.com/dart-lang/language/issues/1122.
The Dart 语言规范 https://dart.dev/guides/language/spec解释:
17.21 属性提取
财产提取允许将成员作为属性来访问,而不是
比一个函数。属性提取可以是:
- 实例方法闭包,将方法转换为函数
对象(17.21.3)。或者
- getter 调用,返回 getter 方法调用的结果
(17.21.1)。
通过闭包从成员派生的函数对象通俗地称为撕裂。
The 有效的 Dart 指南 https://dart.dev/guides/language/effective-dart/usage#dont-create-a-lambda-when-a-tear-off-will-do也指撕裂并用较少的行话描述它们:
如果您引用对象上的方法但省略括号,Dart 会给您一个“tear-off”——一个采用与该方法相同的参数并在您调用它时调用它的闭包。
换句话说,“撕裂”是用于描述从函数或方法名称创建函数对象的行为的术语。它们相当于其他语言中的函数指针或成员函数指针。当您想直接使用函数或方法作为回调时,您可以使用撕除。例如:
class Foo {
final int value;
const Foo(this.value);
int add(int other) => value + other;
int multiply(int other) => value * other;
}
void main() {
const foo = Foo(5);
// `foo.add` is an instance method tear-off. It is equivalent to:
// `(int other) => foo.add(other)`
var someOperation = foo.add;
print(someOperation(8)); // Prints: 13
someOperation = foo.multiply;
print(someOperation(8)); // Prints: 40
}
(This 最终也应该在 Dart 语言之旅中进行解释 https://github.com/dart-lang/site-www/issues/1158.)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)