69·进阶特性高级

PhantomData 幽灵类型

PhantomData 幽灵类型

学习目标

  1. 理解 PhantomData 的用途
  2. 掌握生命周期标记
  3. 理解类型状态模式

核心概念

基本用法

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...