首页 > 解决方案 > 你可以在 Dart 中将扩展方法作为函数参数传递吗?

问题描述

有没有办法将扩展方法作为函数参数传递?

如果可能的话,我想将扩展方法传递给.map静态函数之类的方法。

像这样的东西:

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

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

// I'd like to do something like this
[1, 2, 3, 3, 5].map(Add10.add10);

// Like I could do with a regular function
[1, 2, 3, 4, 5].map(add100);

// instead of
[1, 2, 3, 4, 5].map(x => x.add10());

这可能吗?

换句话说,int返回的扩展方法能否int满足签名

int Function(int)

像我的add100功能可以吗?

或者扩展方法是否总是更像一个在调用之前必须包装值的类?

标签: dartextension-methods

解决方案


不,不是那样的。

在这方面,扩展方法就像一个实例方法。您不能将实例方法从intint 提取到函数,将其传递到其他地方,然后在其他整数上调用该方法。

就像实例方法一样,您需要执行以下操作:

[1, 2, 3, 3, 5].map((x) => x.add10())

这是扩展方法不如它们打算替换的静态辅助函数可用的一种情况。正如@eugene-kuzmenko 指出的那样,您可以将扩展方法改为静态函数(不一定在extension声明中),然后您可以将其撕下并将其作为参数传递,因为它本质上与单个接收器无关,但它需要数字作为参数,就像Iterable.map期望的那样。

如果您要将地图的结果转换为List无论如何,我可能只会使用文字:

var numbers = [1, 2, 3, 3, 4];
var newNumbers = [for (var x in numbers) x.add10()];

它看起来稍微麻烦一些,但实际上我发现不必编写函数字面量会更方便(并且它也适用于异步操作)。


推荐阅读