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 的实现方式,两个函数 downcast 和 downcast_pin 的实现逻辑应该没有问题吧?还是说有其他的实现方式?
1
共 1 条评论, 1 页
评论区
写评论应该违反了pin的保证吧,至少要返回Pin<Box>吧。我的理解