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

Dart中是否有更简洁的成员函数映射方式?

解决方案

Dart 1 中的简化方式

你可以编写一个通用的方法转换工具函数,避免为每个成员方法单独写适配逻辑:

typedef TResult Method<TInstance, TResult>(TInstance instance);

Method<TInstance, TResult> bindMethod<TInstance, TResult>(TResult Function() method) {
  return (TInstance instance) => Function.apply(method, [], {#receiver: instance});
}

之后在代码里复用这个工具函数即可:

class Foo {
  int v;
  int v2() { return v * v; }
}

List<int> mapFoos(List<Foo> foos) {
  // 用通用工具转换成员方法,无需重复写适配函数
  return foos.map(bindMethod<Foo, int>(Foo.v2)).toList();
}

这个工具函数借助Dart 1的Function.apply,通过#receiver命名参数将实例绑定到成员方法上,把无参的成员方法转换成接收实例的函数类型,完美匹配map所需的(Foo) → int参数类型。

另外需要注意:Iterable.map()返回的是Iterable<int>而非List<int>,所以必须调用.toList()完成类型转换,你的原始代码会因为类型不匹配报错,这点要补上。

Dart 2+ 中的原生支持

Dart 2及以后的版本原生支持实例方法提取(tear-offs),你想要的写法可以直接编译通过:

class Foo {
  int v;
  int v2() { return v * v; }
}

List<int> mapFoos(List<Foo> foos) {
  // 直接使用类的成员方法作为map参数,类型自动匹配
  return foos.map(Foo.v2).toList();
}

在新版本中,Foo.v2会被自动解析为int Function(Foo)类型的函数,完全符合map方法的参数要求,不需要任何额外适配代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:20:42