3

これは、さまざまな taits 間の Rust 動的キャスト トレイト オブジェクトからのフォローアップの質問です。Rcそこで提供されたソリューションは、特性オブジェクトの参照を使用する場合に非常にうまく機能しますが、今回はポインターで同じことをしようとしています。例えば

  • という名前のスーパー トレイトと、and という名前TraitABの 2 つのトレイトがTraitAあります。TraitB
  • TraitABそのため、を使用する代わりに型の特性オブジェクトを最初に作成するときは、ポインターBoxを使用するようになりました。Rc
  • TraitA参照するタイプの変数が必要ですab

ここで私は非常に最小限の例を作りました:

use std::rc::Rc;

trait TraitAB: TraitA + TraitB {
    fn as_a(&self) -> Rc<dyn TraitA>;
    fn as_b(&self) -> Rc<dyn TraitB>;
}

trait TraitA {}
trait TraitB {}

struct MyType {}

impl TraitAB for MyType {
    fn as_a(&self) -> Rc<dyn TraitA> {
        Rc::clone(self)
    }
    fn as_b(&self) -> Rc<dyn TraitB> {
        Rc::clone(self)
    }
}

impl TraitA for MyType {}
impl TraitB for MyType {}

fn main() {
    let a: Rc<dyn TraitA>;
    let b: Rc<dyn TraitB>;
    {
        let mut ab: Rc<dyn TraitAB> = Rc::new(MyType {});
        a = ab.as_a();
        b = ab.as_b();
    }
}

しかし、これはうまくいきません。エラーメッセージによると:

error[E0308]: mismatched types
  --> src/main.rs:15:19
   |
15 |         Rc::clone(self)
   |                   ^^^^ expected struct `std::rc::Rc`, found struct `MyType`
   |
   = note: expected reference `&std::rc::Rc<dyn TraitA>`
              found reference `&MyType`

error[E0308]: mismatched types
  --> src/main.rs:18:19
   |
18 |         Rc::clone(self)
   |                   ^^^^ expected struct `std::rc::Rc`, found struct `MyType`
   |
   = note: expected reference `&std::rc::Rc<dyn TraitB>`
              found reference `&MyType`

as_aas_bself が実際にはRcポインタであることを知ることはできません。複製された共有ポインタのキャストを行う方法はありますか?

4

2 に答える 2