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 では、多くの演算子をトレイトによってオーバーロードできます。つまり、一部の演算子は、 入力引数に基づいて異なるタスクを実行するために使用できます。これが可能なのは、 演算子がメソッド呼び出しの構文糖だからです。たとえば、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` トレイトは、`+` の機能を指定するために使用されます。
// ここでは、型 `Bar` の右辺との加算のためのトレイトである `Add<Bar>` を作成します。
// 次のブロックは、操作 Foo + Bar = FooBar を実装します
impl ops::Add<Bar> for Foo {
    type Output = FooBar;

    fn add(self, _rhs: Bar) -> FooBar {
        println!("> Foo.add(Bar) が呼び出されました");

        FooBar
    }
}

// 型を逆にすることで、非可換な加算を実装することになります。
// ここでは、型 `Foo` の右辺との加算のためのトレイトである `Add<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構文索引