Function抽象 最终

函数值。

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 方法的行为与调用函数一样。这主要用于条件性地调用可为空的函数值。

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".

与这个 class 声明中不显示的特殊功能相比,Function 类型具有许多特殊功能。

由于它是任何函数类型的超类型,因此 Function 类型本身允许将任何函数分配给它,但并没有说明如何调用函数。

然而,具有静态类型 Function 的值 仍然可以 被当作函数来调用。

Function f = (int x) => "$x";
print(f(1)); // Prints "1".

f("not", "one", "int"); // Throws! No static warning.

此类调用是一种 动态 调用,精确地就像函数值被静_LATENT 学类型化为 dynamic 一样,以及与其他动态调用一样不安全。运行时将执行检查以确保参数列表与函数的参数匹配,如果不匹配,则将使用 Error 失败。这样调用没有静态类型检查,任何参数列表都会在运行时被接受和检查。

就像每个函数类型都有一个具有与自身函数类型相同的签名的 call 方法一样,Function 类型有一个特殊的 call 成员,该成员的行为就像是一个具有 Function 类型(这不是一个可以用普通 Dart 代码表示的方法签名)的方法。

Function fun = (int x) => "$x";

var fun2 = fun.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