如何避免Rust中的隐式重复?

时间:2018-08-25 13:47:36

标签: rust dry

我有以下实现,但我不想重复自己。如何在不同结构上使用具有相同主体的实现,而无需重复?

impl Message for CreateHero {
    type Result = Result<Hero, Error>;
}

impl Message for SearchHero {
    type Result = Result<Hero, Error>;
}

impl Message for DeleteHero {
    type Result = Result<Hero, Error>;
}

1 个答案:

答案 0 :(得分:4)

Rust中如何避免重复的答案通常是宏。

您的情况实际上很简单,就像宏一样:

macro_rules! hero_message {
    ($name : ident) => {
        impl Message for $name {
            type Result = Result<Hero, Error>;
        }
    }
}
hero_message!{CreateHero}
hero_message!{SearchHero}
hero_message!{DeleteHero}

阅读linked duplicated question中的答案,您还可以编写一个通用特征实现,对于像您这样的简单问题,它看起来会更加惯用。看起来像这样:

trait MessageHero {}

impl<T: MessageHero> Message for T {
    type Result = Result<Hero, Error>;
}

impl MessageHero for CreateHero {}
impl MessageHero for SearchHero {}
impl MessageHero for DeleteHero {}