You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart 中 tear-off/tearoff/tear off 是什么含义?

什么是 Dart 中的 tear-off

tear-off 是 Dart 中对函数取值操作的俗称,指的是将方法/函数直接作为函数对象赋值,而不添加调用括号立即执行的行为,相当于把可执行的方法从所属的上下文里“撕下来”作为独立变量使用。

普通函数 tear-off 示例

你可以直接把顶层函数、静态方法作为值赋值给函数类型的变量,后续再调用:

// 顶层函数
int add(int a, int b) => a + b;

void main() {
  // 这里就是对add做tear-off,没有加调用括号
  int Function(int, int) addFunc = add;
  print(addFunc(1,2)); // 输出3
}

实例方法 tear-off(instance method tear-off)

特指从类的实例对象上获取的方法 tear-off,这类函数对象会隐式绑定生成它的实例作为内部this上下文:

class Calculator {
  final int baseNum;
  Calculator(this.baseNum);

  int addBase(int num) => baseNum + num;
}

void main() {
  var calc = Calculator(10);
  // 从实例calc上获取addBase的tear-off,自动绑定了calc实例
  int Function(int) addBaseFunc = calc.addBase;
  print(addBaseFunc(5)); // 输出15
}

Isolate.spawn<T> 禁止传入实例方法 tear-off 的原因

Dart 的 Isolate 之间内存完全隔离,只能传递可以序列化的常量值。而实例方法 tear-off 依赖运行时生成的实例对象,无法跨 Isolate 序列化和传递绑定的上下文,所以官方要求传入的必须是编译时就能确定的顶层函数或静态方法,不能是运行时生成的实例方法 tear-off,也不能是函数表达式。


内容的提问来源于stack exchange,提问作者Ben Butterworth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 14:06:03