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