你能在 Dart 中将扩展方法作为函数参数传递吗?

Can you pass an extension method as a function argument in 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 上的扩展方法 returns 和 int 是否可以满足签名

int Function(int)

喜欢我的add100功能可以吗?

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

技术上你可以在扩展中使用静态函数

[1, 2, 3, 3, 5].map(**Add10.add10**);

所以你可以改变你的扩展方法(和函数签名)

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

但我认为这不是个好主意

不,不是那样的。

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

就像实例方法一样,您需要做的是:

[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()];

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