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没有大小,因此无法用标准指针表示。