我有几个方法的特征。一些(但不是所有)实现此特征的结构都具有以下方法之一的所有相同实现:
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完全相同的方式实现了方法。
有没有办法让他们共享该功能的代码?
我正在考虑继承自该特性Blabla并xy作为该特性的默认实现提供的第二个特性,如下所示:
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)