你能在 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()];
它看起来稍微麻烦一些,但在实践中我发现不必编写函数文字更方便(并且它也适用于异步操作)。
有没有办法将扩展方法作为函数参数传递?
如果可能的话,我想像静态函数一样将扩展方法传递给 .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()];
它看起来稍微麻烦一些,但在实践中我发现不必编写函数文字更方便(并且它也适用于异步操作)。