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

Function 类型有一些在此 声明中不可见的特殊功能。

由于 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 = 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".
可用扩展

属性

hashCode Type
operator== 兼容的哈希码值。
无设置器继承
runtimeType Type
对象运行时类型的表示。
无设置器继承

方法

noSuchMethod(Invocation invocation) → dynamic
当访问不存在的方法或属性时被调用。
继承
toString() String
该对象的字符串表示。
继承

运算符

operator ==(Object other) bool
测试另一个对象是否与此函数相等。
重写

静态方法

apply(Function function, List? positionalArguments, [Map<Symbol, dynamic>? namedArguments]) → dynamic
使用指定的参数动态调用 function