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
相关产品推荐
相关产品推荐

