什么是撕下/撕下/撕下?

Ben*_*rth 12 dart flutter

我正在阅读 的文档Isolate.spawn<T>,它提到“实例方法撕裂”。我不知道那是什么,也找不到其他地方的解释。什么是撕扯?

该函数必须是一个顶级函数或静态方法,可以使用单个参数调用,即一个编译时常量函数值,它接受至少一个位置参数,并且最多有一个必需的位置参数。该函数可以接受任意数量的可选参数,只要它可以仅使用一个参数来调用。该函数不能是函数表达式或实例方法撕裂的值。

它在这个 github 问题中也被大量使用:支持方法/函数重载

jam*_*lin 16

Dart语言规范解释道:

\n
\n

17.21 属性提取

\n

属性提取允许将成员作为属性而不是函数进行访问。属性提取可以是:

\n
    \n
  1. 实例方法闭包,将方法转换为函数\n对象 (17.21.3)。或者
  2. \n
  3. getter 调用,返回 getter 方法调用的结果\n(17.21.1)。
  4. \n
\n

通过闭包从成员派生的函数对象通俗地称为撕裂。

\n
\n

Effective Dart》指南还提到了撕纸,并用较少的行话对其进行了描述:

\n
\n

如果您引用对象上的方法但省略括号,Dart 会为您提供一个 \xe2\x80\x9ctear-off\xe2\x80\x9d\xe2\x80\x94a 闭包,它采用与该方法相同的参数并调用它当你调用它时。

\n
\n

换句话说,“撕裂”是用于描述从函数或方法名称创建函数对象的行为的术语。它们相当于其他语言中的函数指针或成员函数指针。当您想直接使用函数或方法作为回调时,您可以使用撕除。例如:

\n
class 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}\n
Run Code Online (Sandbox Code Playgroud)\n

(这最终也应该在 Dart 语言之旅中得到解释。)

\n


Ben*_*rth 8

我猜谷歌开发人员已经意识到这是一个令人困惑的领域,所以他们上周制作了一个简洁的视频: 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)