Я пытаюсь создать функцию верхнего уровня:
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. Я просто не уверен, как реализовать это как общую функцию.