【Rust】 From トレイト

blog1.mammb.com


From トレイト

std::convert::Fromトレイトは、ある型から別の型のインスタンスを生成するための汎用のコンストラクタとして機能する。

pub trait From<T>: Sized {
    fn from(value: T) -> Self;
}

引数の所有権を受け取り、自身の型に変換を行い、呼び出し元に変換結果の所有権を返す。

標準ライブラリのすべての型Tは、From<T>(と Into<T>)を実装している。

例えば Ipv4Addr は以下のように From トレイトを実装している。

impl From<u32> for Ipv4Addr {
    fn from(ip: u32) -> Ipv4Addr { Ipv4Addr::from_bits(ip) }
}

impl From<[u8; 4]> for Ipv4Addr {
    fn from(octets: [u8; 4]) -> Ipv4Addr { Ipv4Addr { octets } }
}

様々な引数からIpv4Addr を生成できる(どの実装を使うかは、型推論で自動的に決まる)。

let addr1 = Ipv4Addr::from(0xd076eb94_u32);
let addr2 = Ipv4Addr::from([66, 146, 219, 98]);

From トレイトを実装しておけば、Into トレイトが自動的に実装される。Into トレイトについては以下参照。

blog1.mammb.com

独自の型を作成する際、引数が1つだけのコンストラクタを作るなら、対応する型に対する From<T> の実装とすると良い。これにより、対応する Into の実装が無料で手に入る。

FromもIntoも失敗できない変換を表すトレイトだ。これらのAPIによる変換は失敗することが許されない。 失敗する可能性のある変換には TryFromTryInto を使う。