Rust 如何获得a&;从盒子里拿出来<;dyn T>;

Rust 如何获得a&;从盒子里拿出来<;dyn T>;,rust,Rust,我正试图从框中获取&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; } trait-MyTrait{ } 结构Foo; Foo{}的impl MyTrait fn main(){

我正试图从
框中获取
&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;
}
trait-MyTrait{
}
结构Foo;
Foo{}的impl MyTrait
fn main(){
设b:Box=Box::new(Foo);
设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`
错误[E0277]:未满足特性绑定的'Box:MyTrait'
-->src/main.rs:10:27
|
10 |设c:&dyn MyTrait=&b;
|^^trait`MyTrait`未为`Box实现`
|
=注意:强制转换为对象类型“dyn MyTrait”时需要`

很明显,您可以从
框中获得
&T
。我不明白为什么您不能从
框中获取
&dyn t

要从
框中获取
&dyn t
,请使用
&*

let c: &dyn MyTrait = &*b;
*
用于将框中的内容删除(
dyn MyTrait
),然后使用
&
将其作为参考


这也是从
框中获取
&Foo
的“正确”方法。
&b
与具体类型一起工作的原因是该特性允许将
&Box
强制为
&T

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

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

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

可能是因为dyn t没有大小,因此无法用标准指针表示。