我正在阅读 的文档Isolate.spawn<T>,它提到“实例方法撕裂”。我不知道那是什么,也找不到其他地方的解释。什么是撕扯?
该函数必须是一个顶级函数或静态方法,可以使用单个参数调用,即一个编译时常量函数值,它接受至少一个位置参数,并且最多有一个必需的位置参数。该函数可以接受任意数量的可选参数,只要它可以仅使用一个参数来调用。该函数不能是函数表达式或实例方法撕裂的值。
它在这个 github 问题中也被大量使用:支持方法/函数重载。
jam*_*lin 16
Dart语言规范解释道:
\n\n\n17.21 属性提取
\n属性提取允许将成员作为属性而不是函数进行访问。属性提取可以是:
\n\n
\n- 实例方法闭包,将方法转换为函数\n对象 (17.21.3)。或者
\n- getter 调用,返回 getter 方法调用的结果\n(17.21.1)。
\n通过闭包从成员派生的函数对象通俗地称为撕裂。
\n
《Effective Dart》指南还提到了撕纸,并用较少的行话对其进行了描述:
\n\n\n如果您引用对象上的方法但省略括号,Dart 会为您提供一个 \xe2\x80\x9ctear-off\xe2\x80\x9d\xe2\x80\x94a 闭包,它采用与该方法相同的参数并调用它当你调用它时。
\n
换句话说,“撕裂”是用于描述从函数或方法名称创建函数对象的行为的术语。它们相当于其他语言中的函数指针或成员函数指针。当您想直接使用函数或方法作为回调时,您可以使用撕除。例如:
\nclass Foo {\n final int value;\n\n const Foo(this.value);\n\n int add(int other) => value + other;\n int multiply(int other) => value * other;\n}\n\nvoid main() {\n const foo = Foo(5);\n\n // `foo.add` is an instance method tear-off. It is equivalent to:\n // `(int other) => foo.add(other)`\n var someOperation = foo.add;\n print(someOperation(8)); // Prints: 13\n\n someOperation = foo.multiply;\n print(someOperation(8)); // Prints: 40\n}\nRun Code Online (Sandbox Code Playgroud)\n\n
我猜谷歌开发人员已经意识到这是一个令人困惑的领域,所以他们上周制作了一个简洁的视频: Tear-offs | 解码颤振
例如,他们建议:
ElevatedButton(
onPressed: () { myHandler(); }
)
Run Code Online (Sandbox Code Playgroud)
使用:
ElevatedButton(
onPressed: myHandler <-- myHandler is a tear-off
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4198 次 |
| 最近记录: |