상자에서 & dyn T를 얻는 방법 <dyn T> [중복]
Jan 11 2021
나는 얻기 위해 노력하고 &dyn T
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
에서 얻을 수 있다는 것은 분명합니다 Box<T>
. &dyn T
에서를 얻을 수없는 이유를 이해할 수 없습니다 Box<dyn T>
.
답변
2 kmdreko Jan 11 2021 at 07:22
에서를 얻으려면 다음 &dyn T
을 Box<dyn T>
사용하십시오 &*
.
let c: &dyn MyTrait = &*b;
는 *
데 사용되는 DEREF 내용 (상자로 dyn MyTrait
), 그리고 &
참조로 얻기 위해 사용된다.
이것은 또한을 얻을 수있는 "오른쪽"방법 &Foo
A로부터 Box<Foo>
. 하는 이유 &b
때문에 구체적인 유형의 작품이 Deref특성이 허용 &Box<T>
하는 강제 로 &T
:
T가 Deref <Target = U>를 구현하고 x가 T 유형의 값인 경우 :
- & T 유형의 값은 & U 유형의 값으로 강제 변환됩니다.
특성 개체에 대해 작동하지 않는 이유는 유효 &dyn MyTrait
할 수 있고 &Box<...>
실패하더라도 강제 변환을 시도하지 않기 때문입니다.