ボックスから&dynTを取得する方法<dynT> [重複]
次の例のように、&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>
。
回答
2 kmdreko
からを取得するに&dyn T
は、次Box<dyn T>
を使用します&*
。
let c: &dyn MyTrait = &*b;
*
するために使用されるDEREFその内容(にボックスdyn MyTrait
)、次いで&
基準としてそれを取得するために使用されます。
これは、&Foo
からを取得するための「正しい」方法でもありBox<Foo>
ます。&b
具象型で機能する理由は、Deref特性が次の&Box<T>
ように強制されることを可能にするため&T
です。
TがDeref <Target = U>を実装し、xがタイプTの値である場合、次のようになります。
- タイプ&Tの値は、タイプ&Uの値に強制されます
特性オブジェクトに対して機能しない理由は、有効である&dyn MyTrait
可能性が&Box<...>
あり、失敗しても強制が試行されないためです。