【Rust】Into トレイト

blog1.mammb.com


Into トレイト

std::convert::Intoトレイトはある型の値を消費して別の型を返す変換を表す。

以下の定義となっている。

pub trait Into<T>: Sized {
    fn into(self) -> T;
}

std::convert::Intoトレイトは、std::convert::Fromトレイトと対を成す。

blog1.mammb.com

これらは、同じことを行う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]