From と Into

ある型から別の型への変換。

導出可能: ❌、derive_more のようなクレートなしでは不可。

// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0

pub struct Wrapper(String);

impl From<&str> for Wrapper {
    fn from(value: &str) -> Self {
        Wrapper(value.to_owned())
    }
}

impl From<i32> for Wrapper {
    fn from(value: i32) -> Self {
        Wrapper(value.to_string())
    }
}

// トレイト境界として使う場合は `Into` のほうが自然です。
fn into_string<S: Into<String>>(s: S) {}
fn string_from<T>(t: T) where String: From<T> {}

fn main() {
    // `Wrapper` は `&str` と `i32` から構築できます。
    let a = Wrapper::from("Hello, obvious!");
    let b = Wrapper::from(-123);

    // From の実装があれば、Into の実装も含意されます。
    let c: Wrapper = "Hello, implementation!".into();
}
  • 型変換の機能を提供します。

  • From はコンストラクタ風の関数を提供し、一方 Into は既存の値に対するメソッド を提供します。

  • 自分が作成している型に対しては、Into<T> ではなく From<T> の実装を書くことを推奨します。

    From を実装している任意の型に対しては、Into トレイトが自動的に 実装されます。

  • 関数の引数に対するトレイト境界としては、関数が受け取れるものの意図を明確にするため、 Into が推奨されます。T: Into<String> のほうが String: From<T> より意図が 明確です。