【发布时间】:2021-02-27 20:52:57
【问题描述】:
我有一个接收Box<dyn Trait> 的函数,需要将其转换为Rc<dyn Trait> 以在线程内共享只读所有权。
使用Box<T> 和一些T: Sized,我们可以做到Rc::new(*my_box),但不幸的是that doesn't work for unsized trait objects。
这是一个过于简单的例子,希望能澄清问题:
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
}
我看到 some things here and there 公开了内部 RcBox 以支持在 Box 和 Rc 之间移动,但 AFAIK 它今天不可用。
有解决办法吗?
或者,如果这种类型的转换是不可能的,那么推荐的存储特征对象的方法是什么,该对象可以在某个点发生变异,然后在该点之后与程序的其余部分不可更改地共享?
当我知道到目前为止我只有一个所有者时,使用 Rc<RefCell<dyn Trait>> 似乎有点过头了......
【问题讨论】:
-
不是答案,但您可以使用
Rc<Box<dyn Trait>>并将其保留在堆中
标签: memory-management rust trait-objects