私は、copycatと同様のアーキテクチャを持つRustのためのRaftコンセンサスアルゴリズムミドルウェアを構築しています。開発者がコマンドのスキームを定義するためのマクロを書きました。このマクロは、ユーザー定義のコマンドに対してdispatch
という機能を持つ特性A
を生成します。これは、開発者がその動作のために構造体を実装し、このトピックとは関係のないエンコーダ/デコーダを必要とするためです。形質の親形質を実現するための代替手段はありますか?
特性オブジェクトは、Server
オブジェクトを登録して機能させます。形質A
が動的に生成されるので、A
の親形質として別の形質B
を定義する必要があります。 Server
は、B
と連携してA
で定義されたdispatch
関数を呼び出します。
私は別の組み合わせを試みましたが、どれもうまくいきませんでした。
trait B {
fn dispatch(&mut self, fn_id: u64) -> Vec<u8>;
}
// macro generated trait
trait A: B {
fn a(&self) -> Vec<u8>;
fn b(&self) -> Vec<u8>;
fn dispatch(&mut self, fn_id: u64) -> Vec<u8> {
match fn_id {
1 => a(),
2 => b(),
_ => {}
}
}
}
残念ながら、A
でdispatch
機能はB
でdispatch
を実装していません。 A
の構造体を実装すると、コンパイラはまだB
のためにdispatch
を実装するよう依頼しました。
私もB
の親形質として他の形質に特色B
でdispatch
を移動しようとしたが、トレイトはA
のために実装することはできません。
https://github.com/rust-lang/rfcs/issues/1024も確認しました。問題は開いているようだが、捨てられているようだ。このパターンを動作させる代替方法はありますか?
あなたの質問は非常に明確ではありません。なぜ、 'A'特性を作り出すマクロを展開すると同時に' B'を実装しないのですか? – Shepmaster
@Shepmasterマクロによって生成されたAのようなより多くの形質が存在するため、サーバーはディスパッチを呼び出すために共通の特性を必要とします。 – Shisoft