PhantomData 幽灵类型
学习目标
- 理解 PhantomData 的用途
- 掌握生命周期标记
- 理解类型状态模式
核心概念
基本用法
use std::marker::PhantomData;
// PhantomData<T> 是零大小类型,用于标记关联
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();
// door.open(); // ❌ 锁上后不能直接开
}
标记所有权
use std::marker::PhantomData;
struct OwnedPtr<T> {
ptr: *mut T,
_marker: PhantomData<T>, // 标记拥有 T
}
unsafe impl<T: Send> Send for OwnedPtr<T> {}
unsafe impl<T: Sync> Sync for OwnedPtr<T> {}
小结
| 用途 | 说明 |
|---|---|
| 生命周期标记 | 关联生命周期不使用的类型 |
| 类型状态 | 编译时状态机 |
| 所有权标记 | 标记类型拥有某个值 |
| 零大小 | 没有运行时开销 |
练习编辑器
rust
Loading...