函数指针类型

语法

BareFunctionType :

   ForLifetimes? FunctionTypeQualifiers fn

      ( FunctionParametersMaybeNamedVariadic? ) BareFunctionReturnType?

FunctionTypeQualifiers:

   unsafe? (extern Abi?)?

BareFunctionReturnType:

   -> TypeNoBounds

FunctionParametersMaybeNamedVariadic :

   MaybeNamedFunctionParameters | MaybeNamedFunctionParametersVariadic

MaybeNamedFunctionParameters :

   MaybeNamedParam ( , MaybeNamedParam )* ,?

MaybeNamedParam :

   OuterAttribute* ( ( IDENTIFIER | _ ) : )? Type

MaybeNamedFunctionParametersVariadic :

   ( MaybeNamedParam , )* MaybeNamedParam , OuterAttribute* ...

函数指针类型使用 fn 关键字编写,它引用一个在编译时不一定已知的函数。它们可以通过从 函数项 和非捕获 闭包 进行强制转换来创建。

unsafe 限定符表示该类型的值是一个 不安全函数,而 extern 限定符表示它是一个 外部函数

可变参数只能使用带有 "C""cdecl" 调用约定的 extern 函数类型来指定。

一个示例,其中 Binop 被定义为函数指针类型

#![allow(unused)]
fn main() {
fn add(x: i32, y: i32) -> i32 {
    x + y
}

let mut x = add(5,7);

type Binop = fn(i32, i32) -> i32;
let bo: Binop = add;
x = bo(5,7);
}

函数指针参数上的属性

函数指针参数上的属性遵循与 常规函数参数 相同的规则和限制。