Передайте типизированную функцию в качестве параметра в Dart
Я знаю, что класс Function может передаваться как параметр другой функции, например:
void doSomething(Function f) {
f(123);
}
Но есть ли способ ограничить аргументы и возвращаемый тип параметра функции?
Например, в этом случае f
вызывается непосредственно на целое число, но что, если это функция, принимающая другой тип?
Я попытался передать его как Function<Integer>
, но функция не является параметрическим типом.
Есть ли другой способ указать подпись функции, передаваемой в качестве параметра?
Ответы
Ответ 1
В Dart v1.23 добавлен новый синтаксис для написания типов функций, который также работает in-line.
void doSomething(Function(int) f) {
f(123);
}
Он имеет преимущество перед синтаксисом функции-параметра в том, что вы также можете использовать его для переменных или в любом другом месте, где вы хотите написать тип.
void doSomething(Function(int) f) {
Function(int) g = f;
g(123);
}
var x = new List<int Function(int)>[];
int Function(int) returnsAFunction() => (int x) => x + 1;
Ответ 2
Изменение: Обратите внимание, что этот ответ содержит устаревшую информацию. См. Ответ Irn для получения более актуальной информации.
Чтобы развернуть ответ Рэндала, ваш код может выглядеть примерно так:
typedef void IntegerArgument(int x);
void doSomething(IntegerArgument f) {
f(123);
}
Function<int>
кажется, что это была бы хорошая идея, но проблема в том, что мы можем указать тип возвращаемого значения, а также тип произвольного количества аргументов.
Ответ 3
У вас может быть параметр с параметром функции или использовать typedef
void main() {
doSomething(xToString);
doSomething2(xToString);
}
String xToString(int s) => 's';
typedef String XToStringFn(int s);
void doSomething(String f(int s)) {
print('value: ${f(123)}');
}
void doSomething2(XToStringFn f) {
print('value: ${f(123)}');
}
Пример DartPad
Ответ 4
Для этого нужны typedefs !
Ответ 5
Для справки.
int execute(int func(int a, int b)) => func(4, 3);
print(execute((a, b) => a + b));