기본 메서드
트레잇의 디폴트 메서드에서 다른(구현되지 않은) 메소드를 이용할 수 있습니다:
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_equal
메서드를 새로운 트레잇인NotEqual
로 이동합니다. -
NotEqual
을Equal
의 슈퍼 트레잇으로 만듭니다.trait NotEquals: Equals { fn not_equals(&self, other: &Self) -> bool { !self.equals(other) } }
-
Equal
에NotEqual
의 포괄적 구현을 제공합니다.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) } }
- 포괄적 구현을 사용하면 더 이상
NotEqual
이Equal
의 슈퍼 트레잇으로 필요하지 않습니다.
- 포괄적 구현을 사용하면 더 이상