假设我有一个类型为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())
};
但似乎不起作用。我知道目前有一个实验性的功能来向上投射物体,但这似乎没有帮助。
1条答案
按热度按时间bihw5rsg1#
最简单的方法是添加一个从
Arc<Asset>
转换为Arc<dyn Any>
的方法。在as-any
之后,我们可以在自定义trait中这样做,并为它提供一个全面的实现: