연산자 오버로딩
Rust에서 많은 연산자들은 트레이트를 통해 오버로딩될 수 있습니다. 즉, 일부 연산자들은 입력 인자에 따라 서로 다른 작업을 수행하는 데 사용될 수 있습니다. 이는 연산자가 메서드 호출의 구문 설탕(syntactic sugar)이기 때문에 가능합니다. 예를 들어, a + b에서의 + 연산자는 (a.add(b)와 같이) add 메서드를 호출합니다. 이 add 메서드는 Add 트레이트의 일부입니다. 따라서 + 연산자는 Add 트레이트의 모든 구현체에서 사용될 수 있습니다.
연산자를 오버로딩하는 Add와 같은 트레이트들의 목록은 core::ops에서 찾을 수 있습니다.
use std::ops;
struct Foo;
struct Bar;
#[derive(Debug)]
struct FooBar;
#[derive(Debug)]
struct BarFoo;
// `std::ops::Add` 트레이트는 `+`의 기능을 지정하는 데 사용됩니다.
// 여기서 우리는 `Add<Bar>`를 만듭니다 - 이는 RHS(우항) 타입이 `Bar`인 덧셈을 위한 트레이트입니다.
// 다음 블록은 Foo + Bar = FooBar 연산을 구현합니다.
impl ops::Add<Bar> for Foo {
type Output = FooBar;
fn add(self, _rhs: Bar) -> FooBar {
println!("> Foo.add(Bar)가 호출되었습니다");
FooBar
}
}
// 타입을 반대로 함으로써, 우리는 비가환(non-commutative) 덧셈을 구현하게 됩니다.
// 여기서 우리는 `Add<Foo>`를 만듭니다 - 이는 RHS 타입이 `Foo`인 덧셈을 위한 트레이트입니다.
// 이 블록은 Bar + Foo = BarFoo 연산을 구현합니다.
impl ops::Add<Foo> for Bar {
type Output = BarFoo;
fn add(self, _rhs: Foo) -> BarFoo {
println!("> Bar.add(Foo)가 호출되었습니다");
BarFoo
}
}
fn main() {
println!("Foo + Bar = {:?}", Foo + Bar);
println!("Bar + Foo = {:?}", Bar + Foo);
}