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

