我有一个接收 aBox<dyn Trait>
并需要将其转换为 aRc<dyn Trait>
以在线程内共享只读所有权的函数。
使用 a Box<T>
of some T: Sized
,我们可以做到Rc::new(*my_box)
,但不幸的是,这不适用于未调整大小的 trait 对象。
这是一个过于简化的示例,希望可以澄清问题:
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
以支持在 and 之间移动Box
的东西Rc
,但是 AFAIK 它今天不可用。
有解决方法吗?
或者,如果这种类型的转换是不可能的,那么推荐的存储特征对象的方法是什么,该对象可以被变异到某个点,然后在该点之后与程序的其余部分不可更改地共享?
当我知道到目前为止我只有一个所有者时,使用 aRc<RefCell<dyn Trait>>
似乎有点矫枉过正......