有什么不同?
@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 };