この記事のモチベーション
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();
}
である。