虚类型参数

虚类型(phantom type)参数是一种在运行时不出现,而在(且仅在)编译时进行静态检查 的类型参数。

可以用额外的泛型类型参数指定数据类型,这类型可以充当标记,也可以供编译时类型检查 使用。这些额外的参数没有存储值,也没有运行时行为。

在下面例子中,我们使用 std::marker::PhantomData 作为虚类型参数的类型,创建 包含不同数据类型的元组。

1. use std::marker::PhantomData;

3. // 这个虚元组结构体对 `A` 是泛型的,并且带有隐藏参数 `B`。
4. #[derive(PartialEq)] // 允许这种类型进行相等测试(equality test)。
5. struct PhantomTuple<A, B>(A,PhantomData<B>);

7. // 这个虚类型结构体对 `A` 是泛型的,并且带有隐藏参数 `B`。
8. #[derive(PartialEq)] // 允许这种类型进行相等测试。
9. struct PhantomStruct<A, B> { first: A, phantom: PhantomData<B> }

11. // 注意:对于泛型 `A` 会分配存储空间,但 `B` 不会。
12. //       因此,`B` 不能参与运算。

14. fn main() {
15. // 这里的 `f32` 和 `f64` 是隐藏参数。
16. // 被指定为 `<char, f32>` 的 `PhantomTuple` 类型。
17. let _tuple1: PhantomTuple<char, f32> = PhantomTuple('Q', PhantomData);
18. // 被指定为 `<char, f64>` `PhantomTuple` 类型。
19. let _tuple2: PhantomTuple<char, f64> = PhantomTuple('Q', PhantomData);

21. // 被指定为 `<char, f32>` 的类型。
22. let _struct1: PhantomStruct<char, f32> = PhantomStruct {
23. first: 'Q',
24. phantom: PhantomData,
25. };
26. // 被指定为 `<char, f64>` 的类型。
27. let _struct2: PhantomStruct<char, f64> = PhantomStruct {
28. first: 'Q',
29. phantom: PhantomData,
30. };

32. // 编译期错误!类型不匹配,所以这些值不能够比较:
33. //println!("_tuple1 == _tuple2 yields: {}",
34. //          _tuple1 == _tuple2);

36. // 编译期错误!类型不匹配,所以这些值不能够比较:
37. //println!("_struct1 == _struct2 yields: {}",
38. //          _struct1 == _struct2);
39. }

参见:

Derive, 结构体, 和 元组结构体