Класс Function
Супертип всех типов функций.
Тип времени выполнения объекта-функции — это тип функции, а значит, подтип Function.
Тип Function не содержит сведений о сигнатурах параметров или типе возвращаемого значения функции. Чтобы задать более точный тип функции, используйте синтаксис типа функции: ключевое слово Function, за которым следует список параметров или список аргументов типа и список параметров; также можно указать необязательный тип возвращаемого значения.
Синтаксис типа функции повторяет определение функции, но вместо её имени используется слово "Function".
Пример:
String numberToString(int n) => "$n"; String Function(int n) fun = numberToString; // Type annotation assert(fun is String Function(int)); // Type check. List<String Function(int)> functions = [fun]; // Type argument.
Тип String Function(int) — это тип функции, которая принимает один позиционный аргумент int и возвращает String.
Пример с обобщённым типом функции:
T id<T>(T value) => value; X Function<X>(X) anotherId = id; // Parameter name may be omitted. int Function(int) intId = id<int>;
Тип функции можно использовать везде, где допустим тип, и его часто используют для функций, принимающих другие функции — «обратные вызовы» — в качестве аргументов.
void doSomething(String Function(int) callback) {
print(callback(1));
} Тип функции имеет все члены, объявленные в Object, поскольку типы функций являются подтипами Object.
У типа функции также есть метод call с сигнатурой, тип которой совпадает с типом самой функции. Вызов метода call работает так же, как вызов функции. В основном этот метод используется для условного вызова значения функции, допускающего значение null.
String Function(int) fun = (n) => "$n"; String Function(int) fun2 = fun.call; // Valid. print(fun2.call(1)); // Prints "1". String Function(int)? maybeFun = Random().nextBool() ? fun : null; print(maybeFun?.call(1)); // Prints "1" or "null".
Тип Function обладает рядом особых свойств, которые не видны в этом объявлении class.
Тип Function позволяет присвоить ему любую функцию, поскольку он является супертипом любого типа функции, но не определяет, как эту функцию можно вызвать.
Однако значение со статическим типом Function всё же можно вызвать как функцию.
Function f = (int x) => "$x";
print(f(1)); // Prints "1".
f("not", "one", "int"); // Throws! No static warning. Такой вызов является динамическим, точно так же, как если бы значение функции имело статический тип dynamic, и столь же небезопасен, как любой другой динамический вызов. Во время выполнения проверяется, соответствует ли список аргументов параметрам функции; если нет, вызов завершается с ошибкой Error. Статическая проверка типов для такого вызова не выполняется: принимается любой список аргументов, который проверяется во время выполнения.
Как и у каждого типа функции есть метод call с собственным типом функции, у типа Function есть особый член call, который действует так, словно это метод с типом функции Function (то есть сигнатурой метода, которую нельзя выразить в обычном коде Dart).
Function fun = (int x) => "$x"; var fun2 = f.call; // Inferred type of `fun2` is `Function`. print(fun2.call(1)); // Prints "1"; Function? maybeFun = Random().nextBool() ? fun : null; print(maybeFun?.call(1)); // Prints "1" or "null".
Конструкторы
- Function()
Свойства
- hashCode → int только для чтенияпереопределение
- Значение хеш-кода, совместимое с
operator==. - runtimeType → Type только для чтенияунаследовано
- Представление типа объекта во время выполнения.
Методы
- noSuchMethod(
Invocation invocation) → dynamic унаследовано - Вызывается при обращении к несуществующему методу или свойству.
- toString(
) → String унаследовано - Строковое представление этого объекта.
Операторы
- operator ==(
Object other) → bool переопределение - Проверяет, равен ли другой объект этой функции.
Статические методы
- apply(
Function function, List? positionalArguments, [Map< Symbol, dynamic>? namedArguments]) → dynamic - Динамически вызывает
functionс указанными аргументами.
© 2012 the Dart project authors
Licensed under the BSD 3-Clause "New" or "Revised" License.
https://api.dart.dev/stable/2.19.6/dart-core/Function-class.html