【Rust】幽灵数据(PhantomData)
std::marker::PhantomData
是一个零大小的类型,用于标记一些类型,这些类型看起来拥有类型 T
,但实际上并没有:
1 | pub struct PhantomData<T> |
Rust
并不希望在定义类型时,出现目前还没使用,但未来会被使用的泛型参数,例如未使用的生命周期参数以及未使用的类型。
PhantomData
最常见的用例可能是具有未使用的生命周期参数的结构体,例如,这儿有一个结构体 Slice
,它有两个 *const T
类型的指针,可能指向某个地方的数组,我们期望 Slice
类型的值在生命周期 'a
内仅仅有效,但是如果像下面这样,'a
我们又无处安放:
1 | struct Slice<'a, T> { |
我们可以使用 PhantomData
告诉编译器就像 Slice
结构包含引用 &'a T
一样来纠正这个问题:
1 | use std::marker::PhantomData; |
这反过来要求 T
类型中的任何引用在生命周期 'a
内都是有效的,初始化 Slice
时,仅需要为 phantom
字段提供值 PhantomData
即可:
1 | fn borrow_vec<T>(vec: &Vec<T>) -> Slice<'_, T> { |