1

我有一个接收 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>>似乎有点矫枉过正......

4

1 回答 1

8

Rc<T> 实现impl<T> From<Box<T, Global>>,因此您可以使用into

let trait_rc: Rc<dyn Trait> = trait_box.into();

永久链接到操场

于 2021-02-27T21:38:13.830 回答