LoginSignup
4
3

More than 1 year has passed since last update.

Rustのstd::convertのFromとかIntoトレイトがわからなくなった時に見る記事

Last updated at Posted at 2021-06-03

この記事のモチベーション

Rustのstd::convertにはFromIntoAsなどがありますが、トレイトがネストしてるときに何から何への変換なのかがわからなくなったので備忘録的にまとめてみました。

結論

FromIntoはムーブする破壊的な変換、Asはムーブしない非破壊的な変換

実体の変換系

From<T>Into<T>は逆の関係を持つ。

Fromトレイト

AFrom<B>を実装していると、BからAへ向かって変換できる。例えば、StringFrom<&str>を実装しているので、&strからStringへ変換できる。ムーブが発生する。

Intoトレイト

AInto<B>を実装していると、AからBへ向かって変換できる。例えば、StringInto<&str>を実装しているので、Stringから&strへ変換できる。ムーブが発生する。

参照の変換系

AsRefトレイト

AAsRef<B>を実装していると、A&Bに変換できる。例えば、StringAsRef<str>を実装しているので、Stringから&strへ変換できる。

AsMutトレイト

AAsMut<B>を実装していると、A&mut Bに変換できる。例えば、StringAsMut<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();
}

である。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3