一次为多个结构实现一个特征

时间:2017-07-25 17:14:51

标签: rust

我有特征FooTrait,它有很多功能。我还有FooStructBarStruct结构,并希望为两个结构实现FooTrait,方法完全相同。

有没有办法同时为FooTraitFooStruct实施BarStruct?我想象了以下内容:

impl FooTrait for FooStruct + BarStruct {
    // implement methods here
}

1 个答案:

答案 0 :(得分:3)

不,没有方法可以同时为多个结构实现一个特征,而不需要像宏这样的元编程。

我甚至可以说也没有理由。如果您实际上“方法完全相同”,那么您应该将公共成员变量提取到不同的结构中并实现该结构的特征(如果您甚至不再需要该特征)。然后,您可以将新结构添加为原始成员。

如果您有类似

的内容
struct Dog {
    hunger: u8,
    wagging: bool,
}

struct Cat {
    hunger: u8,
    meowing: bool,
}

trait Hungry {
    fn is_hungry(&self) -> bool;
}

你可以

struct Dog {
    hunger: Hunger,
    wagging: bool,
}

struct Cat {
    hunger: Hunger,
    meowing: bool,
}

struct Hunger {
    level: u8,
}

impl Hunger {
    fn is_hungry(&self) -> bool {
        self.level > 100
    }
}

如果由于其他原因需要特征,您可以委派它:

trait Hungry {
    fn is_hungry(&self) -> bool;
}

impl Hungry for Hunger {
    fn is_hungry(&self) -> bool {
        self.level > 100
    }
}

impl Hungry for Dog {
    fn is_hungry(&self) -> bool { self.hunger.is_hungry() }
}

impl Hungry for Cat {
    fn is_hungry(&self) -> bool { self.hunger.is_hungry() }
}

最后两个实现仍然相同,但它的重复次数很少。即便如此,我仍然希望在语法层面引入一种授权形式。