默认方法

特征可以依照其他特征方法来实现行为:

trait Equals {
    fn equals(&self, other: &Self) -> bool;
    fn not_equals(&self, other: &Self) -> bool {
        !self.equals(other)
    }
}

#[derive(Debug)]
struct Centimeter(i16);

impl Equals for Centimeter {
    fn equals(&self, other: &Centimeter) -> bool {
        self.0 == other.0
    }
}

fn main() {
    let a = Centimeter(10);
    let b = Centimeter(20);
    println!("{a:?} equals {b:?}: {}", a.equals(&b));
    println!("{a:?} not_equals {b:?}: {}", a.not_equals(&b));
}
  • trait 或许可指定预实现(默认)方法,以及用户需要自行实现的方法。具有默认实现的方法可以依赖于必需的方法。

  • 将方法“not_equals”移至新的 trait“NotEquals”。

  • 将“Equals”设为“NotEquals”的超 trait。

    trait NotEquals: Equals {
        fn not_equals(&self, other: &Self) -> bool {
            !self.equals(other)
        }
    }
  • 为“Equals”提供“NotEquals”的通用实现。

    trait NotEquals {
        fn not_equals(&self, other: &Self) -> bool;
    }
    
    impl<T> NotEquals for T where T: Equals {
        fn not_equals(&self, other: &Self) -> bool {
            !self.equals(other)
        }
    }
    • 借助通用实现,您不再需要将“Equals”作为“NotEqual”的超 trait。