簡體   English   中英

特質實現其父代特質的任何其他方法?

[英]Any alternative way for trait to implement its parent trait?

我正在為Rust構建一個Raft共識算法中間件,其架構與copycat類似。 我為開發人員編寫了一個宏,以定義命令方案。 宏會生成特征A ,該特征具有用於用戶定義的命令的dispatch功能,這要求開發人員為其行為實現結構以及與該主題無關的編碼器/解碼器。

特征對象向Server對象注冊以使其工作。 由於特征A是動態生成的,因此我必須將另一個特征B定義為A父特征。 ServerB一起調用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(),
            _ => {}
        }
    }
}

不幸的是, Adispatch功能不會在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM