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

2024-01-28

我正在阅读有关的文档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 属性提取

财产提取允许将成员作为属性来访问,而不是 比一个函数。属性提取可以是:

  1. 实例方法闭包,将方法转换为函数 对象(17.21.3)。或者
  2. 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(使用前将#替换为@)

什么是撕下/撕下/撕下? 的相关文章

随机推荐