如何将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();

永久链接到游乐场


以上是如何将Box&lt;dynTrait&gt;转换为Rc&lt;dynTrait&gt;?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>