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

标签 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 }
}

最佳答案

最好的选择可能是考虑到您的对象可以有一个位置的事实:

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特征,这将使您受益于运算符重载 +- 。即使您不直接使用这些特征,它们也可能会激发您对潜在的有意义的签名 add(&self, rhs: &P) -> P函数(其中 P: Position<T> )。

关于rust - 如何重用类似特征实现的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32416186/

相关文章:

types - 为什么类型别名不能使用 Rust 中原始类型的关联常量?

rust - 在 Rust 中读取和写入相同的 TcpStream

rust - 我无法理解 Rust "scope"定义(Rust 编程语言,第二版。Klabnik & Nichols)

reference - Rust 找不到特征实现

web-scraping - 使用 scraper crate 检索兄弟元素

string - 为什么从标准输入读取用户输入时我的字符串不匹配?

generics - 如何在 Rust 中定义具有不同 const 参数的结构族?

rust - 如何调用系统命令并捕获其输出?

rust - Tokio 任务可以优雅地终止整个运行时吗?

enums - 如何使用毯式Into trait实现转换回原始类型?