Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

函数项类型

当被引用时,函数项或类元组结构体或枚举变体的构造函数产生其_函数项类型_的零大小值。

该类型显式标识函数 - 其名称、其类型参数及其早期绑定的生命周期参数(但不包括其晚期绑定的生命周期参数,这些参数仅在调用函数时分配) - 因此该值不需要包含实际的函数指针,并且在调用函数时不需要间接寻址。

没有直接引用函数项类型的语法,但编译器将在错误消息中将该类型显示为类似 fn(u32) -> i32 {fn_name} 的内容。

由于函数项类型显式标识函数,不同函数的项类型 - 不同项或具有不同泛型的相同项 - 是不同的,混合它们将创建类型错误:

#![allow(unused)]
fn main() {
fn foo<T>() { }
let x = &mut foo::<i32>;
*x = foo::<u32>; //~ ERROR mismatched types
}

但是,存在从函数项到具有相同签名的函数指针强制转换,这不仅在直接期望函数指针时使用函数项时触发,而且在具有相同签名的不同函数项类型在同一 ifmatch 的不同分支中相遇时也会触发:

#![allow(unused)]
fn main() {
let want_i32 = false;
fn foo<T>() { }

// `foo_ptr_1` has function pointer type `fn()` here
let foo_ptr_1: fn() = foo::<i32>;

// ... and so does `foo_ptr_2` - this type-checks.
let foo_ptr_2 = if want_i32 {
    foo::<i32>
} else {
    foo::<u32>
};
}

所有函数项都实现 CopyCloneSendSync

除非函数具有以下任何特征,否则会实现 FnFnMutFnOnce