§
Fromを実装すべき状況
Fromの実装を使って行える変換に技術的制約はないが、一般的な期待としては変換はおおむね以下のように制限される。
変換は失敗しない : もし変換が失敗しうるなら、代わりに
TryFromを使え; パニックするFromを提供するな。変換は無損失である : 意味論として、情報を失ったり破棄したりすべきでない。例えば、
i32: From<u16>があり、そこでは元の値はu16: TryFrom<i32>を使って復元できる。また、String: From<&str>があり、そこでは元の値と同等のものがDeref経由で取得できる。しかし、Fromはu32からu16への変換には使えない、なぜならこれは無損失な方法では達成できない。(ここで意味論に関係ない情報については余地がある。例えば、Box<[T]>: From<Vec<T>>では、容量が違っても二つのベクターが等しくなりうるように、容量を維持しないかもしれない。)変換は値を維持する : Rust の型や技術的表現が異なっても、概念的な種類と結果値の意味は同じになる。例えば、
asでキャストを戻せば元の値を復元できるため、-1_i8 as u8は無損失だが、-1と255は概念的に異なる値なため (技術的には同じビットパターンだが) その変換はFromを通しては利用できない。ただしf32: From<i16>は1_i16と1.0_f32は概念的に同じ実数なため (技術的には完全に異なるビットパターンだが) 利用できる。String: From<char>はどちらもがテキストなので利用できるが、String: From<u32>は1(数) と"1"(テキスト) があまりに異なるため利用できない。(値のテキストへの変換は代わりにDisplayトレイトによりカバーされる。)変換は明確になる : それは二つの型の間の唯一の合理的変換である。そうでなければ、
str::as_bytesがメソッドであるように、また整数がメソッドu32::from_ne_bytes,u32::from_le_bytes, そしてu32::from_be_bytesを持ち、そのどれもがFromを実装していないように、名前付きのメソッドやコンストラクタを持った方が良い。一方でIpv6AddrをIpAddrにラップするには唯一の合理的な方法があり、そのためIpAddr: From<Ipv6Addr>がある。