From и Into
Преобразование из одного типа в другой.
Можно получить через derive: ❌, без крейтов вроде 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предоставляет метод для существующего значения. -
Для типа, который вы создаёте, предпочитайте писать реализации
From<T>, а неInto<T>.Трейт
Intoавтоматически реализуется для любого типа, который реализуетFrom. -
Intoпредпочтительнее как ограничение трейта для аргументов функций, чтобы было понятно, что функция может принимать:T: Into<String>яснее выражает намерение, чемString: From<T>.