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

在Dart中可以将extension扩展方法作为函数参数传递吗?

Dart扩展方法能否作为函数参数传递?

结论

Dart 2.17 及以上版本支持直接将扩展方法作为函数参数传递,你的示例写法可以直接运行;低于该版本则需要使用替代方案。

版本适配说明

1. Dart 2.17+ 直接使用

从Dart 2.17版本开始引入了扩展方法的tear-off特性,扩展方法可以直接拆分为独立的函数对象,签名完全匹配int Function(int)的要求,和普通顶层函数add100用法完全一致:

extension Add10 on int {
  int add10() {
    return this + 10;
  }
}

int add100(int x) => x + 100;

void main() {
  // 完全合法,输出 [11,12,13,13,15]
  print([1, 2, 3, 3, 5].map(Add10.add10).toList());
  // 和普通函数用法无区别
  print([1, 2, 3, 4, 5].map(add100).toList());
}

2. Dart 2.17 以下版本替代方案

低版本不支持扩展方法tear-off,可选用两种写法实现同等效果:

  • 匿名函数包裹调用(Dart箭头函数的参数需要加括号):
[1, 2, 3, 4, 5].map((x) => x.add10());
  • 手动封装为符合签名的顶层/静态函数:
int add10(int x) => x.add10();
// 后续可以直接传递
[1,2,3,4,5].map(add10);

底层逻辑说明

扩展方法本质就是语法糖,编译后会生成对应静态函数,第一个参数默认是扩展类型的实例,你的Add10.add10编译后等价于:

static int Add10_add10(int $this) => $this + 10;

所以tear-off后天然匹配单参数的函数签名,不需要额外包裹。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:15:05