< 返回版块

dakai-chen 发表于 2025-11-24 11:42

fn downcast<T>(pin: Pin<Box<dyn Any>>) -> Result<T, Pin<Box<dyn Any>>>
where
    T: Unpin + 'static,
{
    if pin.is::<T>() {
        let inner = unsafe { Pin::into_inner_unchecked(pin) };
        Ok(*inner.downcast::<T>().unwrap())
    } else {
        Err(pin)
    }
}

fn downcast_pin<T>(pin: Pin<Box<dyn Any>>) -> Result<Pin<Box<T>>, Pin<Box<dyn Any>>>
where
    T: 'static,
{
    unsafe {
        match Pin::into_inner_unchecked(pin).downcast::<T>() {
            Ok(v) => Ok(Pin::new_unchecked(v)),
            Err(v) => Err(Pin::new_unchecked(v)),
        }
    }
}

我想要实现 Pin<Box<dyn Any>>downcast 功能,但是好像无法通过 safe rust 实现;对于 unsafe 的实现方式,两个函数 downcastdowncast_pin 的实现逻辑应该没有问题吧?还是说有其他的实现方式?

评论区

写评论
bestgopher 2025-11-25 11:20

应该违反了pin的保证吧,至少要返回Pin<Box>吧。我的理解

1 共 1 条评论, 1 页