如何在MaybeUninit<T>已初始化时安全将Pin<&mut MaybeUninit<T>>转为Pin<&mut T>?
从Pin<&mut MaybeUninit>安全获取Pin<&mut T>的方法
在明确MaybeUninit<T>已完成初始化的前提下,可通过以下步骤完成类型转换:
- 从
Pin<&mut MaybeUninit<T>>中提取内部的可变引用 - 借助
MaybeUninit::assume_init_mut将&mut MaybeUninit<T>转换为&mut T(此步为unsafe操作,依赖初始化完成的前提) - 将得到的
&mut T重新包装为Pin<&mut T>
对应的Rust代码实现如下:
use std::pin::Pin; use std::mem::MaybeUninit; fn pin_maybe_uninit_to_pin_mut<T>(pin_mu: Pin<&mut MaybeUninit<T>>) -> Pin<&mut T> { // 提取Pin内部的MaybeUninit可变引用 let mu_ref = Pin::get_mut(pin_mu); // 基于初始化完成的假设,转换为&T的可变引用 let t_ref = unsafe { mu_ref.assume_init_mut() }; // 将可变引用包装为Pin,原Pin已保证内存位置不移动,此操作安全 Pin::new_unchecked(t_ref) }
关键说明
Pin::get_mut是安全操作:它仅提取Pin包裹的可变引用,不会破坏Pin的内存固定性。assume_init_mut的unsafe前提:必须绝对确保MaybeUninit<T>已完成初始化,否则会触发未定义行为。Pin::new_unchecked的安全性:原Pin<&mut MaybeUninit<T>>已保证该内存地址不会被移动,因此转换后的Pin<&mut T>自然继承这一不变性,满足Pin的安全要求。
内容的提问来源于stack exchange,提问作者kalkronline
相关产品推荐
相关产品推荐

