演算子オーバーロード
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); }