3

この記事は最終更新日から1年以上が経過しています。

投稿日

更新日

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

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

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();
}

である。

新規登録して、もっと便利にQiitaを使ってみよう

  1. あなたにマッチした記事をお届けします
  2. 便利な情報をあとで効率的に読み返せます
ログインすると使える機能について
SenK
@SenK
三角関係が好きです。
eaglys
"EAGLYSは、未だ活用しきれていない企業に眠るデータ資産を、 安全にデータ分析・AI構築・運用するサポートを行っています。"

コメント

この記事にコメントはありません。
あなたもコメントしてみませんか :)
新規登録
すでにアカウントを持っている方はログイン
3