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

Zon*_*ico 3 rust

我有FooTrait一个有很多功能的特质。我也有结构体FooStructBarStruct并且想FooTrait用完全相同的方法实现两个结构体。

是否有实施方式FooTrait为两种FooStruct,并BarStruct在一次?我想象了以下内容:

impl FooTrait for FooStruct + BarStruct {
    // implement methods here
}
Run Code Online (Sandbox Code Playgroud)

She*_*ter 7

不,没有像宏这样的元编程,就无法同时为多个结构实现一个特征。

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

如果你有类似的东西

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

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

trait Hungry {
    fn is_hungry(&self) -> bool;
}
Run Code Online (Sandbox Code Playgroud)

你可以有

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
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您出于其他原因需要该特征,则可以委托它:

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() }
}
Run Code Online (Sandbox Code Playgroud)

这最后两个实现仍然相同,但它是最少的重复。即便如此,我仍然希望在语法级别引入一种委托形式。