[英]Any alternative way for trait to implement its parent trait?
我正在為Rust構建一個Raft共識算法中間件,其架構與copycat類似。 我為開發人員編寫了一個宏,以定義命令方案。 宏會生成特征A
,該特征具有用於用戶定義的命令的dispatch
功能,這要求開發人員為其行為實現結構以及與該主題無關的編碼器/解碼器。
特征對象向Server
對象注冊以使其工作。 由於特征A
是動態生成的,因此我必須將另一個特征B
定義為A
父特征。 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
dispatch
轉移到另一個特征作為B
的父特征,但是該特征無法為A
實現。
我還查看了https://github.com/rust-lang/rfcs/issues/1024 。 看來問題是未解決的,但已經放棄了。 有沒有其他方法可以使這種模式起作用?
您根本不需要B
成為A
的超特性。 您可以為任何T: A
添加B
的全面實現。 我認為這更接近意圖。
解釋Rust代碼:
trait A: B {
“您可以實現A
,但前提是您已經實現B
”
trait A {
//...
}
impl<T: A> B for T {
“如果實現A
,這是B
的免費實現。”
這是完整版本:
trait B {
fn dispatch(&mut self, fn_id: u64) -> Vec<u8>;
}
// macro generated trait
trait A {
fn a(&self) -> Vec<u8>; // added &self
fn b(&self) -> Vec<u8>;
}
impl<T: A> B for T {
fn dispatch(&mut self, fn_id: u64) -> Vec<u8> {
match fn_id {
1 => self.a(),
2 => self.b(),
_ => panic!(), // Needed so that match cases are exhaustive
}
}
}
struct S {}
impl A for S {
fn a(&self) -> Vec<u8> {
unimplemented!()
}
fn b(&self) -> Vec<u8> {
unimplemented!()
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.