rust - 如何从盒子中获得 &dyn T
问题描述
我正在尝试&dyn T
从 a中获取 a Box<dyn T>
,如下例所示。但是,它无法编译。
trait MyTrait {
}
struct Foo;
impl MyTrait for Foo {}
fn main() {
let b: Box<dyn MyTrait> = Box::new(Foo);
let c: &dyn MyTrait = &b;
}
错误信息是
error[E0277]: the trait bound `Box<dyn MyTrait>: MyTrait` is not satisfied
--> src/main.rs:10:27
|
10 | let c: &dyn MyTrait = &b;
| ^^ the trait `MyTrait` is not implemented for `Box<dyn MyTrait>`
|
= note: required for the cast to the object type `dyn MyTrait`
很明显,您可以&T
从 a 中获得 a Box<T>
。我不明白为什么你不能&dyn T
从 a 中得到 a Box<dyn T>
。
解决方案
要从 a 中获取&dyn T
a Box<dyn T>
,请使用&*
:
let c: &dyn MyTrait = &*b;
*
用于将框解引用到其内容 ( dyn MyTrait
) 中,然后&
用于获取它作为参考。
这也是&Foo
从 a中获取 a 的“正确”方式Box<Foo>
。&b
使用具体类型的原因是因为Deref
trait 允许&Box<T>
被强制为&T
:
如果 T 实现 Deref<Target = U>,并且 x 是 T 类型的值,则:
- &T 类型的值被强制转换为 &U 类型的值
它不适用于特征对象的原因是它&dyn MyTrait
可能有效&Box<...>
并且即使它失败也不会尝试强制。
推荐阅读
- php - Blade - 自定义指令的不同随机数
- javascript - 立方体贴图(天空盒)的三个 js 角是暗的
- python - 在 Elastic Beanstalk 上托管的 Django webapp 中的电子邮件验证失败
- python - “groupby”方法抛出“值的长度与索引的长度不匹配”
- elasticsearch - 对测试和生产使用相同的 elasticsearch 集群
- python - GeeksForGeeks 实践:在 python 中打印大于其大小的数组
- c# - 如何更改 Xamarin 打开应用列表中的 iOS 图标
- android - 保存的图像不会出现在图库中
- java-8 - 无法从 Flux 转换
到单声道 - c# - Marshal.GetExceptionCode() 的替代方案?