函数项类型
当被引用时,函数项,或元组式结构体或枚举变体的构造器,会产生一个零大小的 函数项类型 的值。
该类型显式地标识了函数 - 它的名称、它的类型参数以及它的早期绑定生命周期参数(但不包括它的后期绑定生命周期参数,这些参数仅在函数被调用时才被赋值)- 因此该值不需要包含一个实际的函数指针,并且当函数被调用时也不需要间接寻址。
没有语法可以直接引用函数项类型,但是编译器会在错误信息中将该类型显示为类似于 fn(u32) -> i32 {fn_name}
的形式。
因为函数项类型显式地标识了函数,所以不同函数的项类型 - 不同的项,或具有不同泛型的相同项 - 是不同的,并且混合它们会产生类型错误。
#![allow(unused)] fn main() { fn foo<T>() { } let x = &mut foo::<i32>; *x = foo::<u32>; //~ ERROR mismatched types }
然而,存在一个从函数项到具有相同签名的 函数指针 的 强制转换,这不仅在当直接期望函数指针时使用函数项时触发,而且在具有相同签名的不同函数项类型在同一个 if
或 match
的不同分支中相遇时也会触发。
#![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> }; }