dart - 你可以在 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
功能可以吗?
或者扩展方法是否总是更像一个在调用之前必须包装值的类?
解决方案
不,不是那样的。
在这方面,扩展方法就像一个实例方法。您不能将实例方法从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()];
它看起来稍微麻烦一些,但实际上我发现不必编写函数字面量会更方便(并且它也适用于异步操作)。
推荐阅读
- javascript - XRegexP.matchRecursive - 添加回调功能以允许多个相同的实例
- javascript - 单击时显示缩略图的大图像,但包含多个容器
- java - MongoDB检查连接无异常
- c# - 麦克风输入的最大浮点数为1。如何将其变大并从1更改?统一 C#
- python - 如何检查某些值是否不在 for 循环内的列表中(二进制到十进制程序)
- css - 使标题占据与下面的框相同的宽度
- ios - Admob 奖励视频 - 根视图控制器问题
- c# - 如何使用 linq C# 读取复杂的 XML
- android - 如何删除 ScrollView 中的单个视图
- sql - 将两个外键链接到一个主键