如何将Box<dynTrait>转换为Rc<dynTrait>?
我有一个接收 a 的函数,Box<dyn Trait>需要将其转换为 anRc<dyn Trait>以在线程内共享只读所有权。
随着Box<T>一些T: Sized,我们可以做的Rc::new(*my_box),但不幸的是不起作用的未分级特征的对象。
这是一个过于简化的例子,希望能澄清这个问题:
use std::rc::Rc;
pub trait Trait {}
pub struct Foo {}
impl Trait for Foo {}
fn main() {
let trait_box: Box<dyn Trait> = Box::new(Foo {});
let trait_rc: Rc<dyn Trait> = Rc::new(*trait_box); // -> Error
}
游乐场链接
我在这里和那里看到了一些关于暴露内部RcBox以支持在Box和之间移动的事情Rc,但 AFAIK 今天不可用。
有解决方法吗?
或者,如果这种类型的转换是不可能的,那么推荐的存储特征对象的方法是什么?
Rc<RefCell<dyn Trait>>当我知道到目前为止我只有一个所有者时,使用 a似乎有点矫枉过正......
回答
Rc<T> 实现,impl<T> From<Box<T, Global>>所以你可以只使用into:
let trait_rc: Rc<dyn Trait> = trait_box.into();
永久链接到游乐场
THE END
二维码