From e Into

RustRustBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, exploramos los conceptos de los tratos From e Into en Rust, que se utilizan para convertir entre diferentes tipos. Estos tratos están inherentemente vinculados, con Into siendo el recíproco de From. El trato From permite que un tipo defina cómo crear sí mismo a partir de otro tipo, lo que facilita la conversión entre tipos. El trato Into llama automáticamente a la implementación de From cuando sea necesario. Ambos tratos se pueden implementar para tipos personalizados, lo que proporciona flexibilidad en las conversiones de tipos.

Nota: Si el laboratorio no especifica un nombre de archivo, puede usar cualquier nombre de archivo que desee. Por ejemplo, puede usar main.rs, compilar y ejecutarlo con rustc main.rs &&./main.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/AdvancedTopicsGroup(["Advanced Topics"]) rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/DataTypesGroup -.-> rust/integer_types("Integer Types") rust/DataTypesGroup -.-> rust/string_type("String Type") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/DataStructuresandEnumsGroup -.-> rust/method_syntax("Method Syntax") rust/AdvancedTopicsGroup -.-> rust/traits("Traits") rust/AdvancedTopicsGroup -.-> rust/operator_overloading("Traits for Operator Overloading") subgraph Lab Skills rust/variable_declarations -.-> lab-99299{{"From e Into"}} rust/integer_types -.-> lab-99299{{"From e Into"}} rust/string_type -.-> lab-99299{{"From e Into"}} rust/function_syntax -.-> lab-99299{{"From e Into"}} rust/expressions_statements -.-> lab-99299{{"From e Into"}} rust/method_syntax -.-> lab-99299{{"From e Into"}} rust/traits -.-> lab-99299{{"From e Into"}} rust/operator_overloading -.-> lab-99299{{"From e Into"}} end

From e Into

Los tratos From y Into están inherentemente vinculados, y esto es en realidad parte de su implementación. Si es posible convertir el tipo A a partir del tipo B, entonces es fácil de creer que deberíamos poder convertir el tipo B al tipo A.

From

El trato From permite que un tipo defina cómo crear sí mismo a partir de otro tipo, proporcionando así un mecanismo muy simple para convertir entre varios tipos. Hay numerosas implementaciones de este trato en la biblioteca estándar para la conversión de tipos primitivos y comunes.

Por ejemplo, podemos convertir fácilmente un str en un String

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

Podemos hacer lo mismo para definir una conversión para nuestro propio tipo.

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

El trato Into es simplemente el recíproco del trato From. Es decir, si ha implementado el trato From para su tipo, Into lo llamará cuando sea necesario.

Usar el trato Into generalmente requerirá especificar el tipo al que se desea convertir, ya que el compilador no puede determinarlo en la mayoría de los casos. Sin embargo, este es un pequeño inconveniente teniendo en cuenta que obtenemos la funcionalidad gratis.

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;
    // Intenta quitar la anotación de tipo
    let num: Number = int.into();
    println!("My number is {:?}", num);
}

Resumen

¡Felicitaciones! Has completado el laboratorio de From e Into. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.