[英]How do you convert a Box<dyn Trait> to a Rc<dyn Trait>?
我有一個 function 接收Box<dyn Trait>
並需要將其轉換為Rc<dyn Trait>
以在線程內共享只讀所有權。
使用某個T: Sized
的Box<T>
,我們可以執行Rc::new(*my_box)
,但不幸的是,這不適用於 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
}
我在這里和那里看到了一些關於暴露內部RcBox
以支持在Box
和Rc
之間移動的事情,但是 AFAIK 今天它不可用。
有解決方法嗎?
或者,如果這種類型的轉換是不可能的,那么推薦的存儲特征 object 的方法是什么,該特征可以突變到一個點,然后在該點之后與程序的 rest 不可改變地共享?
當我知道到目前為止我只有一個所有者時,使用Rc<RefCell<dyn Trait>>
似乎有點矯枉過正......
Rc<T>
實現了impl<T> From<Box<T, Global>>
所以你可以使用into
:
let trait_rc: Rc<dyn Trait> = trait_box.into();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.