Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

연산자 오버로딩

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

참고

Add, 구문 색인