Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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>.