これは、さまざまな 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_a
as_b
self が実際にはRc
ポインタであることを知ることはできません。複製された共有ポインタのキャストを行う方法はありますか?