gpt4 book ai didi

memory-management - 如何将 Box 转换为 Rc

转载 作者:行者123 更新时间:2023-12-03 11:32:07 28 4
gpt4 key购买 nike

我有一个接收 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
}

Playground link

我看到了some things here and there关于暴露内部RcBox支持在 Box 之间移动和 Rc ,但据我所知,它今天不可用。

有解决办法吗?

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

使用 Rc<RefCell<dyn Trait>>当我知道到那时我只有一个所有者时,这似乎有点过分了……

最佳答案

Rc<T> implements impl<T> From<Box<T, Global>> 所以你可以使用 into :

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

Permalink to the playground

关于memory-management - 如何将 Box<dyn Trait> 转换为 Rc<dyn Trait>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66403357/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com