如何从 Box<dyn T> 获取 &dyn T

时间:2021-01-10 23:57:10

标签: rust

我正在尝试从 &dyn T 获取 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 获得 Box<T>。我不明白为什么你不能从 &dyn T 得到 Box<dyn T>

1 个答案:

答案 0 :(得分:3)

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

let c: &dyn MyTrait = &*b;

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


这也是从 &Foo 获取 Box<Foo> 的“正确”方式。 &b 适用于具体类型的原因是因为 Deref trait 允许 &Box<T>强制&T:

<块引用>

如果 T 实现了 Deref,并且 x 是 T 类型的值,则:

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

它对 trait 对象不起作用的原因是 &dyn MyTrait 可能&Box<...> 有效,并且即使它失败也不会尝试强制转换。 >