預設方法

特徵可以依照其他特徵方法來實作行為:

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));
}
  • 特徵可能會指定預先實作的 (預設) 方法,以及使用者必須自行實作的方法。採用預設實作項目的方法可以信賴必要方法。

  • not_equals 方法移至新特徵 NotEquals

  • Equals 設為 NotEquals 的超特徵。

    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 的超特徵。