From & Into
Conversion from one type to another.
Derivable: ❌, without crates like 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` is more natural to use as a trait bound. fn into_string<S: Into<String>>(s: S) {} fn string_from<T>(t: T) where String: From<T> {} fn main() { // `Wrapper` can be construct from `&str` and `i32`. let a = Wrapper::from("Hello, obvious!"); let b = Wrapper::from(-123); // A From implementation implies an Into implementation. let c: Wrapper = "Hello, implementation!".into(); }
-
Provides conversion functionality to types.
-
Fromprovides a constructor-style function, whereasIntoprovides a method on an existing value. -
Prefer writing
From<T>implementations for a type you’re authoring instead ofInto<T>.The
Intotrait is implemented for any type that implementsFromautomatically. -
Intois preferred as a trait bound for arguments to functions for clarity of intent for what the function can take:T: Into<String>has clearer intent thanString: From<T>.