From и Into

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном задании мы исследуем концепции трейтов From и Into в Rust, которые используются для преобразования между различными типами. Эти трейты тесно связаны, при этом Into является обратным отображением для From. Трейт From позволяет типу определить, как создавать себя из другого типа, что обеспечивает простое преобразование между типами. Трейт Into автоматически вызывает реализацию From при необходимости. Оба трейта могут быть реализованы для пользовательских типов, обеспечивая гибкость в преобразованиях типов.

Примечание: Если в лабораторном задании не указано имя файла, вы можете использовать любое имя файла, которое хотите. Например, вы можете использовать main.rs, скомпилировать и запустить его с помощью rustc main.rs &&./main.

From и Into

Трейты From и Into тесно связаны, и это на самом деле часть их реализации. Если вы можете преобразовать тип A из типа B, то, логично, полагаться на то, что мы сможем преобразовать тип B в тип A.

From

Трейт From позволяет типу определить, как создавать себя из другого типа, тем самым обеспечивая очень простой механизм преобразования между несколькими типами. В стандартной библиотеке имеется множество реализаций этого трейта для преобразования примитивных и распространенных типов.

Например, мы можем легко преобразовать str в String

let my_str = "hello";
let my_string = String::from(my_str);

Мы можем сделать то же самое для определения преобразования для нашего собственного типа.

use std::convert::From;

#[derive(Debug)]
struct Number {
    value: i32,
}

impl From<i32> for Number {
    fn from(item: i32) -> Self {
        Number { value: item }
    }
}

fn main() {
    let num = Number::from(30);
    println!("My number is {:?}", num);
}

Into

Трейт Into просто обратное отображение для трейта From. То есть, если вы реализовали трейт From для своего типа, Into вызовет его при необходимости.

При использовании трейта Into обычно потребуется указать тип, в который нужно преобразовать, так как компилятор в большинстве случаев не может определить это самостоятельно. Однако это небольшая цена за то, что мы получаем эту функциональность бесплатно.

use std::convert::Into;

#[derive(Debug)]
struct Number {
    value: i32,
}

impl Into<Number> for i32 {
    fn into(self) -> Number {
        Number { value: self }
    }
}

fn main() {
    let int = 5;
    // Попробуйте удалить аннотацию типа
    let num: Number = int.into();
    println!("My number is {:?}", num);
}

Резюме

Поздравляем! Вы завершили лабораторную работу по From и Into. Вы можете выполнить больше лабораторных работ в LabEx, чтобы улучшить свои навыки.