簡體   English   中英

你如何轉換一個盒子<dyn trait>到 Rc<dyn trait> ?</dyn></dyn>

[英]How do you convert a Box<dyn Trait> to a Rc<dyn Trait>?

我有一個 function 接收Box<dyn Trait>並需要將其轉換為Rc<dyn Trait>以在線程內共享只讀所有權。

使用某個T: SizedBox<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以支持在BoxRc之間移動的事情,但是 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM