我正在尝试创建一个顶级功能:
Iterable<E> mapEnumerated<T>(Iterable<T> iterable, E Function<E>(int, T) fn) sync* {
var index = 0;
for (final item in iterable) {
yield fn(index++, item);
}
}
但是,它报告错误消息:The name 'E' isn't a type so it can't be used as a type argument.
。
然后,我尝试将其更改为以下内容,上述错误消失了,我不知道为什么,但是我仍然无法使用它:
Iterable mapEnumerated<T>(Iterable<T> iterable, E Function<E>(int, T) fn) sync* {
var index = 0;
for (final item in iterable) {
yield fn(index++, item);
}
}
void main() {
List<String> strs = mapEnumerated([5, 6, 7],
(i, e) => (i + e).toString()
).toList();
print(strs);
}
这将报告错误:The argument type '(dynamic, dynamic) → String' can't be assigned to the parameter type '<E>(int, int) → E'
。
任何人都可以告诉我实施此操作的正确方法是什么吗?
以下代码可以工作,但根本不是通用函数:
Iterable<String> mapEnumerated(Iterable<int> iterable, String Function(int, int) fn) sync* {
var index = 0;
for (final item in iterable) {
yield fn(index++, item);
}
}
void main() {
List<String> strs = mapEnumerated([5, 6, 7],
(i, e) => (i + e).toString()
).toList();
print(strs);
}
非常感谢。
参考:原始代码来自https://github.com/dart-lang/sdk/issues/32467。我只是不确定如何将其实现为通用函数。
答案 0 :(得分:3)
类型变量E
仅在参数fn
的函数类型中引入,因此在该变量之外不可用。
此处的fn
函数被声明为接受通用函数,因此您将无法使用(i, e) => (i + e).toString)
对其进行调用,因为该函数本身不是通用的。
您可以将函数重写为:
Iterable<E> mapEnumerated<T, E>(Iterable<T> iterable, E Function(int, T) fn) sync* {
var index = 0;
for (final item in iterable) {
yield fn(index++, item);
}
}
这在E
函数上引入了mapEnumerated
类型的变量,因此可以在该函数的返回类型中使用。