如何为类似的特征实现重用代码?

时间:2015-09-05 18:07:28

标签: rust

我有一些默认实现的特性,需要相同的方法,恰好是字段getter。

trait AddPosition<T: Display>{
    fn x(&self) -> T;
    fn y(&self) -> T;
    fn add(&self){
        println!("{:}", self.x()+self.x());
    }
}

trait SubPosition<T: Display>{
    fn x(&self) -> T;
    fn y(&self) -> T;
    fn sub(&self){
        println!("{:}", self.x()-self.y());
    }
}

不是为每个特征实现手动重复相同的代码,我可以这样做吗?

impl AddPosition<i32>, SubPosition<i32> for Point{
    fn x(&self) -> i32{ self.x }
    fn y(&self) -> i32{ self.y }
}

1 个答案:

答案 0 :(得分:4)

最好的选择可能是你的对象可以有一个位置:

trait Position<T: Display> {
    fn x(&self) -> T;
    fn y(&self) -> T;
}

// trait AAA: BBB --> means AAA must implement BBB
trait AddPosition<T: Add<Output=T> + Display>: Position<T> {
    fn add(&self){
        println!("{:}", self.x()+self.x()); // ?
    }
}

trait SubPosition<T: Sub<Output=T> + Display>: Position<T> {
    fn sub(&self){
        println!("{:}", self.x()-self.y()); // ?
    }
}

struct MyPosition {
    x: i32,
    y: i32,
}

impl Position<i32> for MyPosition {
    fn x(&self) -> i32 { self.x }
    fn y(&self) -> i32 { self.y }
}
impl SubPosition<i32> for MyPosition {}
impl AddPosition<i32> for MyPosition {}

(Playground)

但是,我无法理解你的代码是如何有意义的(?注释行)。如果这只是为了最小的例子,这是完全正常的;但是,如果这是针对任何严肃的代码,您可能需要查看AddSub特征,这样您就可以从运算符重载+和{{1}中受益}。即使您不直接使用这些特征,它们也可能激发您对潜在-函数(add(&self, rhs: &P) -> P)的有意义签名。