Into トレイト
std::convert::Intoトレイトはある型の値を消費して別の型を返す変換を表す。
以下の定義となっている。
pub trait Into<T>: Sized { fn into(self) -> T; }
std::convert::Intoトレイトは、std::convert::Fromトレイトと対を成す。
これらは、同じことを行う2つの方法を提供しているに過ぎないが、使いみちは異なる。
From は汎用のコンストラクタとして機能するのに対し、Into は一般的に、関数が受け取る引数を柔軟にするために用いられる。
例えば 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 } } }
From トレイトを実装しておけば、後述の Into トレイトが自動的に実装されるため、以下のような関数を定義すれば、
use std::net::Ipv4Addr; fn ping<A>(address: A) -> std::io::Result<bool> where A: Into<Ipv4Addr> { let ipv4_address = address.into(); // ... }
この関数は、Ipv4Addr に変換可能な任意の型を受け取ることができる。
ここでの任意の型は、Ipv4Addr が実装した From トレイトにより、Into トレイトが自動的に実装されるため、以下のように呼び出すことができる。
ping(0xd076eb94_u32); // pass a u32 ping([66, 146, 219, 98]); // pass a [u8; 4]