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>より意図が 明確です。