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);
}

See Also

Add, Syntax Index

results matching ""

    No results matching ""