特质可以为其继承的特质的方法提供默认实现吗?

Amo*_*gel 7 traits rust

我有几个方法的特征。一些(但不是所有)实现此特征的结构都具有以下方法之一的所有相同实现:

trait Blabla {
    fn xy(self, x: u32, y: u32) -> u32;
}

// ---------------------------------
struct Ding {}

impl Blabla for Ding {
    fn xy(self, x: u32, y: u32) -> u32 {
        x + y
    }
}

// ---------------------------------
struct Dong {
    dong_attribute: u32,
}

impl Dong {
    fn get_1(self) -> u32 {
        1
    }
}

impl Blabla for Dong {
    fn xy(self, x: u32, y: u32) -> u32 {
        x + y + self.get_1()
    }
}

// ---------------------------------
struct Dung {
    dung_attribute: f32,
}

impl Dung {
    fn get_1(self) -> u32 {
        1
    }
}

impl Blabla for Dung {
    fn xy(self, x: u32, y: u32) -> u32 {
        x + y + self.get_1()
    }
}
Run Code Online (Sandbox Code Playgroud)

该示例中有三个结构体,每个结构体都实现了Blablatrait,其中两个以xy完全相同的方式实现了方法。

有没有办法让他们共享该功能的代码?

我正在考虑继承自该特性Blablaxy作为该特性的默认实现提供的第二个特性,如下所示:

trait Blabla {
    fn xy(self, x: u32, y: u32) -> u32;
}

// ----------------------------------
trait Blubblub: Blabla {
    fn get_1(self) -> u32;
    fn xy(self, x: u32, y: u32) -> u32 {
        x + y + self.get_1()
    }
}

// ---------------------------------
struct Ding {}

impl Blabla for Ding {
    fn xy(self, x: u32, y: u32) -> u32 {
        x + y
    }
}

// ---------------------------------
struct Dong {
    dong_attribute: u32,
}

impl Blubblub for Dong {
    fn get_1(self) -> u32 {
        1
    }
}

// ---------------------------------
struct Dung {
    dung_attribute: f32,
}

impl Blubblub for Dung {
    fn get_1(self) -> u32 {
        1
    }
}

fn main() {
    let x = Dung {
        dung_attribute: 1.0,
    };
    println!{"{}", x.xy(1,1)};
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为 Rust 中的 trait 继承意味着需要实现这两个 trait,因此它不会让我免于在Blabla::xyforDong和的实现中键入相同的代码Dung

orl*_*rlp 10

实现Blabla与所有的默认实现Blubblub和你的榜样工程:

trait Blubblub: Blabla {
    fn get_1(self) -> u32;
}

impl<T: Blubblub> Blabla for T {
    fn xy(self, x: u32, y: u32) -> u32 {
        x + y + self.get_1()
    }
}
Run Code Online (Sandbox Code Playgroud)