この記事のモチベーション
Rustのstd::convertにはFromやInto、Asなどがありますが、トレイトがネストしてるときに何から何への変換なのかがわからなくなったので備忘録的にまとめてみました。
結論
FromとIntoはムーブする破壊的な変換、Asはムーブしない非破壊的な変換
実体の変換系
From<T>とInto<T>は逆の関係を持つ。
Fromトレイト
AがFrom<B>を実装していると、BからAへ向かって変換できる。例えば、StringはFrom<&str>を実装しているので、&strからStringへ変換できる。ムーブが発生する。
Intoトレイト
AがInto<B>を実装していると、AからBへ向かって変換できる。例えば、StringはInto<&str>を実装しているので、Stringから&strへ変換できる。ムーブが発生する。
参照の変換系
AsRefトレイト
AがAsRef<B>を実装していると、Aを&Bに変換できる。例えば、StringはAsRef<str>を実装しているので、Stringから&strへ変換できる。
AsMutトレイト
AがAsMut<B>を実装していると、Aを&mut Bに変換できる。例えば、StringはAsMut<str>を実装しているので、Stringから&strへ変換できる。
ここで注意したいのは
- String
- &String
- &&String
のどれでもStringに対してas_mut()またはas_ref()したのと同じになる。つまり、
fn main() {
let x:String = "hoge".to_string();
let _:&str = x.as_ref();
let _:&str = &x.as_ref();
let _:&str = &&x.as_ref();
}
である。
コメント