ボックスから&dynTを取得する方法<dynT> [重複]

Jan 11 2021

次の例のように、&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 Jan 11 2021 at 07:22

からを取得するに&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<...>あり、失敗しても強制が試行されないためです。