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ではメソッドの戻り型のみが異なるオーバーロード(同名のメソッドを複数定義すること)は出来ないので、代入先の型に応じて呼び出すメソッドを変えることは出来ない)