Intoトレイトは、自分のインスタンスを異なる型へ変換する為のintoメソッドを定義しているトレイト。
Intoトレイトはstd::preludeに含まれているので、useしなくても使える。
「異なる型への変換」なので、intoメソッドを呼び出すと、元のインスタンスは(所有権を奪われて)使用できなくなる。
なお、Fromトレイトを実装すると、相手の型に対して自動的にIntoトレイトが実装される。
引数の型ごとにintoメソッドを用意する。
pub trait Into<T>: Sized { fn into(self) -> T; }
intoメソッドの引数はselfなので(&self(参照)ではないので)所有権を奪うことに注意。
struct MyStruct { value: i32, } impl Into<i32> for MyStruct { fn into(self) -> i32 { self.value } } impl Into<i64> for MyStruct { fn into(self) -> i64 { self.value as i64 } }
// 呼び出す例 let s = MyStruct { value: 123 }; let n: i32 = s.into();
代入先の変数の型に応じて、合致するメソッドが呼ばれる。
合致する型が無いときはコンパイルエラーになる。
(Javaではメソッドの戻り型のみが異なるオーバーロード(同名のメソッドを複数定義すること)は出来ないので、代入先の型に応じて呼び出すメソッドを変えることは出来ない)