虚类型参数
虚类型参数是一种在运行时不会出现,但在编译时会进行静态检查的类型参数。
数据类型可以使用额外的泛型类型参数作为标记,或在编译时进行类型检查。这些额外的参数不占用存储空间,也没有运行时行为。
在下面的示例中,我们将 std::marker::PhantomData 与虚类型参数的概念结合,创建包含不同数据类型的元组。
use std::marker::PhantomData;
// 一个虚元组结构体,它在 `A` 上是泛型的,带有隐藏参数 `B`。
#[derive(PartialEq)] // 允许对此类型进行相等性测试。
struct PhantomTuple<A, B>(A, PhantomData<B>);
// 一个虚类型结构体,它在 `A` 上是泛型的,带有隐藏参数 `B`。
#[derive(PartialEq)] // 允许对此类型进行相等性测试。
struct PhantomStruct<A, B> { first: A, phantom: PhantomData<B> }
// 注意:为泛型类型 `A` 分配了存储空间,但没有为 `B` 分配。
// 因此,`B` 不能用于计算。
fn main() {
// 这里,`f32` 和 `f64` 是隐藏参数。
// PhantomTuple 类型指定为 `<char, f32>`。
let _tuple1: PhantomTuple<char, f32> = PhantomTuple('Q', PhantomData);
// PhantomTuple 类型指定为 `<char, f64>`。
let _tuple2: PhantomTuple<char, f64> = PhantomTuple('Q', PhantomData);
// 类型指定为 `<char, f32>`。
let _struct1: PhantomStruct<char, f32> = PhantomStruct {
first: 'Q',
phantom: PhantomData,
};
// 类型指定为 `<char, f64>`。
let _struct2: PhantomStruct<char, f64> = PhantomStruct {
first: 'Q',
phantom: PhantomData,
};
// 编译时错误!类型不匹配,无法比较:
// println!("_tuple1 == _tuple2 的结果是:{}",
// _tuple1 == _tuple2);
// 编译时错误!类型不匹配,无法比较:
// println!("_struct1 == _struct2 的结果是:{}",
// _struct1 == _struct2);
}