虚类型参数

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

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

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

  1. use std::marker::PhantomData;
  2. // 这个虚元组结构体对 `A` 是泛型的,并且带有隐藏参数 `B`。
  3. #[derive(PartialEq)] // 允许这种类型进行相等测试(equality test)。
  4. struct PhantomTuple<A, B>(A,PhantomData<B>);
  5. // 这个虚类型结构体对 `A` 是泛型的,并且带有隐藏参数 `B`。
  6. #[derive(PartialEq)] // 允许这种类型进行相等测试。
  7. struct PhantomStruct<A, B> { first: A, phantom: PhantomData<B> }
  8. // 注意:对于泛型 `A` 会分配存储空间,但 `B` 不会。
  9. // 因此,`B` 不能参与运算。
  10. fn main() {
  11. // 这里的 `f32` 和 `f64` 是隐藏参数。
  12. // 被指定为 `<char, f32>` 的 `PhantomTuple` 类型。
  13. let _tuple1: PhantomTuple<char, f32> = PhantomTuple('Q', PhantomData);
  14. // 被指定为 `<char, f64>` `PhantomTuple` 类型。
  15. let _tuple2: PhantomTuple<char, f64> = PhantomTuple('Q', PhantomData);
  16. // 被指定为 `<char, f32>` 的类型。
  17. let _struct1: PhantomStruct<char, f32> = PhantomStruct {
  18. first: 'Q',
  19. phantom: PhantomData,
  20. };
  21. // 被指定为 `<char, f64>` 的类型。
  22. let _struct2: PhantomStruct<char, f64> = PhantomStruct {
  23. first: 'Q',
  24. phantom: PhantomData,
  25. };
  26. // 编译期错误!类型不匹配,所以这些值不能够比较:
  27. //println!("_tuple1 == _tuple2 yields: {}",
  28. // _tuple1 == _tuple2);
  29. // 编译期错误!类型不匹配,所以这些值不能够比较:
  30. //println!("_struct1 == _struct2 yields: {}",
  31. // _struct1 == _struct2);
  32. }

参见:

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