您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

强制 Arc<Mutex<Option<Box<MyStruct>>>>> 到 Arc<Mutex<Option<Box<dyn Trait>>>>> 将不起作用

强制 Arc<Mutex<Option<Box<MyStruct>>>>> 到 Arc<Mutex<Option<Box<dyn Trait>>>>> 将不起作用

有什么不同?

@R_477_2419@和其他标准库类型有一个非常特殊的情况,它们可以包含动态大小的值,如dyn A.

let c = Arc::new(Mutex::new(Some(@R_477_2419@::new(B{}))));
H { c: c };

在此代码中,您已将变量c(没有类型声明)初始化为类型推断为 的值Arc<Mutex<Option<@R_477_2419@<B>>>,然后尝试将其存储在类型为 的字段中Arc<Mutex<Option<@R_477_2419@<dyn A>>>。这是行不通的,因为这两种类型具有不同的内存布局。

let c: Arc<Mutex<Option<@R_477_2419@<dyn A>>>> = 
    Arc::new(Mutex::new(Some(@R_477_2419@::new(B{}))));

在这代码中,你已经c一个类型声明,作为结果,其中需要dyn知道在哪里的建造点,这使得胁迫很快发生,你可以强迫一个@R_477_2419@<B>@R_477_2419@<dyn A>的,因为@R_477_2419@实现了特殊的特质CoerceUnsized. (相同的机制适用于转换&B&dyn A。)但是,这不适用于包含a 的任意类型@R_477_2419@<B>——甚至不适用Option<@R_477_2419@<B>>,更不用说更复杂的类型了。

你可以c在构造它时给出一个类型:

let c: Arc<Mutex<Option<@R_477_2419@<dyn A>>>> = Arc::new(Mutex::new(Some(@R_477_2419@::new(B{}))));
H { c: c };

或者,稍微短一点但更奇怪,您可以只@R_477_2419@用它需要的类型注释 的直接容器:

let c = Arc::new(Mutex::new(Some::<@R_477_2419@<dyn A>>(@R_477_2419@::new(B{}))));
H { c: c };

或者您可以使用as运算符编写显式强制:

let c = Arc::new(Mutex::new(Some(@R_477_2419@::new(B{}) as @R_477_2419@<dyn A>)));
H { c: c };
其他 2022/1/1 18:52:48 有396人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶