我正在查看一些 rust 源代码,发现了一种名为PhantomData
的数据类型。我浏览了 rust 文件,并在互联网上进行了很多搜索。但是,我无法理解此数据类型在rust中的实际用法。如果可能的话,有人可以简单地向我解释一下吗?
pub struct GPIOD {
_marker: PhantomData<*const ()>,
}
最佳答案
PhantomData
结构旨在向编译器发出信号,即以某种对编译器透明的方式使用了类型或生存期。
引用文档:
例如,如果我们查看切片[T]
的迭代器类型: std::slice::Iter<'a, T>
和its declaration using the button,我们将看到它实际上是这样声明的:
struct Iter<'a, T: 'a> {
start: *const T,
end: *const T,
_phantom: PhantomData<&'a T>,
}
std
频繁使用指针算法来使优化更容易获得(尽管不是来认可用户代码中使用指针算法)。在这种情况下,我们需要确保自己确保两个原始指针(不携带生命周期)所指向的数据的生命周期超过了该结构,因此我们保留了一个PhantomData<&'a T>
来告诉编译器像Iter
拥有&'a T
一样工作。强制执行生命周期规则。