虚类型参数

虚类型参数是一种在运行时不会出现,但在编译时会进行静态检查的类型参数。

数据类型可以使用额外的泛型类型参数作为标记,或在编译时进行类型检查。这些额外的参数不占用存储空间,也没有运行时行为。

在下面的示例中,我们将 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);
}

另请参阅:

派生(Derive)结构体(struct)元组结构体(TupleStructs)