虚类型参数 - Rust By Example
Description: Rust by Example (RBE) is a collection of runnable examples that illustrate various Rust concepts and standard libraries.

## 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

# 虚类型参数

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

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

在下面的示例中，我们将 `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, and tuple.