PhantomData 幽灵类型
学习目标
- 理解 PhantomData 的用途
- 掌握生命周期标记
- 理解类型状态模式
核心概念
基本用法
use std::marker::PhantomData;
struct Iter<'a, T: 'a> {
ptr: *const T,
end: *const T,
_marker: PhantomData<&'a T>,
}
类型状态模式
use std::marker::PhantomData;
struct Locked;
struct Unlocked;
struct Door<State> {
_state: PhantomData<State>,
}
impl Door<Locked> {
fn unlock(self) -> Door<Unlocked> {
Door { _state: PhantomData }
}
}
impl Door<Unlocked> {
fn open(&self) {
println!("门开了");
}
fn lock(self) -> Door<Locked> {
Door { _state: PhantomData }
}
}
impl<State> Door<State> {
fn new() -> Door<Locked> {
Door { _state: PhantomData }
}
}
fn main() {
let door = Door::<Locked>::new();
let door = door.unlock();
door.open();
}
标记所有权
use std::marker::PhantomData;
struct OwnedPtr<T> {
ptr: *mut T,
_marker: PhantomData<T>,
}
unsafe impl<T: Send> Send for OwnedPtr<T> {}
unsafe impl<T: Sync> Sync for OwnedPtr<T> {}
小结
| 用途 | 说明 |
|---|
| 生命周期标记 | 关联生命周期不使用的类型 |
| 类型状态 | 编译时状态机 |
| 所有权标记 | 标记类型拥有某个值 |
| 零大小 | 没有运行时开销 |