14.2 Operator Overloading
Rust에서, 많은 연산자들이 trait을 통해 오버로드 될 수 있다. 즉, 일부 연산자들은 그들의 입력 인수에 맞춰 다른 작업을 수행할 수 있게 된다. 이게 가능한 이유는 연산자가 메소드 호출하는 문법적 (개)꿀이라서다. 예를 들어, +
연산자가 a + b
에선 add
메소드 (a.add(b)
처럼)를 호출한다.
Add
같은 오버로드 연산자 trait 목록은 여기에서 확인할 수 있다.
use std::ops; struct Foo; struct Bar; #[derive(Debug)] struct FooBar; #[derive(Debug)] struct BarFoo; // `std::ops::Add` trait은 `+`의 기능을 지정하는데 사용된다. // 여기서 우리는 `Bar` 타입인 RHS를 가진 trait을 추가해 `Add`를 만든다. // 다음에 오는 블럭이 구현하는 연산: Foo + Bar = FooBar impl ops::Add<Bar> for Foo { type Output = FooBar; fn add(self, _rhs: Bar) -> FooBar { println!("> Foo.add(Bar) was called"); FooBar } } // 타입을 뒤바꿔서 교환 없이 구현의 추가를 끝냈다. // 여기서 우리는 `Foo` 타입인 RHS를 가진 trait을 추가해 `Add `를 만든다. // 이 블럭이 구현하는 연산: Bar + Foo = BarFoo impl ops::Add<Foo> for Bar { type Output = BarFoo; fn add(self, _rhs: Foo) -> BarFoo { println!("> Bar.add(Foo) was called"); BarFoo } } fn main() { println!("Foo + Bar = {:?}", Foo + Bar); println!("Bar + Foo = {:?}", Bar + Foo); }