函数值。
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 - 测试另一个对象是否与此函数相等。重写