rust 将“Arc”上推< dyn Trait>为“Arc< dyn Any>”?

ruoxqz4g  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(128)

假设我有一个类型为Asset的trait对象,它存储在一个Arc中,我想将它转换为一个Arc<dyn Any>,以方便以后的向下转换。
有什么安全的方法吗?我已经尝试过使用as-any crate的这种(不安全的)策略,但它似乎破坏了类型信息,因为我不能将结果Arc<dyn Any>转换为它的基本类型:

let res: Box<dyn Asset> = thing_that_returns_dyn_asset();
    let res: Arc<dyn Asset> = Arc::from(res);

    // Unsafe: Cast an Arc<dyn Asset> to an Arc<dyn Any>.
    let res : Arc<dyn Any> = unsafe {
         Arc::from_raw(Arc::into_raw(res).as_any())
    };

但似乎不起作用。我知道目前有一个实验性的功能来向上投射物体,但这似乎没有帮助。

bihw5rsg

bihw5rsg1#

最简单的方法是添加一个从Arc<Asset>转换为Arc<dyn Any>的方法。在as-any之后,我们可以在自定义trait中这样做,并为它提供一个全面的实现:

pub trait AsAnyArc {
    fn as_any_arc(self: Arc<Self>) -> Arc<dyn Any>;
}

impl<T: 'static> AsAnyArc for T {
    fn as_any_arc(self: Arc<Self>) -> Arc<dyn Any> { self }
}

pub trait Asset: AsAnyArc { ... }

let res: Box<dyn Asset> = thing_that_returns_dyn_asset();
let res: Arc<dyn Asset> = Arc::from(res);

let res: Arc<dyn Any> = res.as_any_arc();

相关问题