,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;
}

( https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=69c72904fbceae5b55470a878a441b7d )

错误信息是

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>

标签: rust

解决方案


要从 a 中获取&dyn Ta Box<dyn T>,请使用&*

let c: &dyn MyTrait = &*b;

*用于将框解引用到其内容 ( dyn MyTrait) 中,然后&用于获取它作为参考。


这也是&Foo从 a中获取 a 的“正确”方式Box<Foo>&b使用具体类型的原因是因为Dereftrait 允许&Box<T>强制&T

如果 T 实现 Deref<Target = U>,并且 x 是 T 类型的值,则:

  • &T 类型的值被强制转换为 &U 类型的值

它不适用于特征对象的原因是它&dyn MyTrait 可能有效&Box<...>并且即使它失败也不会尝试强制。


推荐阅读