【问题标题】:How do you convert a Box<dyn Trait> to a Rc<dyn Trait>?如何将 Box<dyn Trait> 转换为 Rc<dyn Trait>?
【发布时间】:2021-02-27 20:52:57
【问题描述】:

我有一个接收Box&lt;dyn Trait&gt; 的函数,需要将其转换为Rc&lt;dyn Trait&gt; 以在线程内共享只读所有权。

使用Box&lt;T&gt; 和一些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
}

Playground link

我看到 some things here and there 公开了内部 RcBox 以支持在 BoxRc 之间移动,但 AFAIK 它今天不可用。

有解决办法吗?

或者,如果这种类型的转换是不可能的,那么推荐的存储特征对象的方法是什么,该对象可以在某个点发生变异,然后在该点之后与程序的其余部分不可更改地共享?

当我知道到目前为止我只有一个所有者时,使用 Rc&lt;RefCell&lt;dyn Trait&gt;&gt; 似乎有点过头了......

【问题讨论】:

  • 不是答案,但您可以使用 Rc&lt;Box&lt;dyn Trait&gt;&gt; 并将其保留在堆中

标签: memory-management rust trait-objects


【解决方案1】:

Rc&lt;T&gt; implements impl&lt;T&gt; From&lt;Box&lt;T, Global&gt;&gt; 所以你可以使用into:

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

Permalink to the playground

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2020-03-26
    相关资源
    最近更新 更多