Clonación de structs en Rust con el trato Clone

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, aprendemos a usar el trato Clone en Rust para hacer copias de recursos, como structs, mediante el método .clone(). El trato Clone nos permite crear copias independientes de recursos, y podemos usar el método .clone() para crear una nueva instancia con los mismos valores.

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/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust(("Rust")) -.-> rust/AdvancedTopicsGroup(["Advanced Topics"]) rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/DataTypesGroup -.-> rust/integer_types("Integer Types") 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/operator_overloading("Traits for Operator Overloading") subgraph Lab Skills rust/variable_declarations -.-> lab-99220{{"Clonación de structs en Rust con el trato Clone"}} rust/integer_types -.-> lab-99220{{"Clonación de structs en Rust con el trato Clone"}} rust/function_syntax -.-> lab-99220{{"Clonación de structs en Rust con el trato Clone"}} rust/expressions_statements -.-> lab-99220{{"Clonación de structs en Rust con el trato Clone"}} rust/method_syntax -.-> lab-99220{{"Clonación de structs en Rust con el trato Clone"}} rust/operator_overloading -.-> lab-99220{{"Clonación de structs en Rust con el trato Clone"}} end

Clone

Cuando se tratan de recursos, el comportamiento predeterminado es transferirlos durante las asignaciones o las llamadas a funciones. Sin embargo, a veces también necesitamos hacer una copia del recurso.

El trato Clone nos ayuda a hacer exactamente esto. En la mayoría de los casos, podemos usar el método .clone() definido por el trato Clone.

// Un struct unitario sin recursos
#[derive(Debug, Clone, Copy)]
struct Unit;

// Un struct tupla con recursos que implementa el trato `Clone`
#[derive(Clone, Debug)]
struct Pair(Box<i32>, Box<i32>);

fn main() {
    // Instanciar `Unit`
    let unit = Unit;
    // Copiar `Unit`, no hay recursos que mover
    let copied_unit = unit;

    // Ambos `Unit` se pueden usar de forma independiente
    println!("original: {:?}", unit);
    println!("copia: {:?}", copied_unit);

    // Instanciar `Pair`
    let pair = Pair(Box::new(1), Box::new(2));
    println!("original: {:?}", pair);

    // Mover `pair` a `moved_pair`, mueve los recursos
    let moved_pair = pair;
    println!("movido: {:?}", moved_pair);

    // Error! `pair` ha perdido sus recursos
    //println!("original: {:?}", pair);
    // TODO ^ Intenta descomentar esta línea

    // Clonar `moved_pair` en `cloned_pair` (los recursos se incluyen)
    let cloned_pair = moved_pair.clone();
    // Eliminar el par original usando std::mem::drop
    drop(moved_pair);

    // Error! `moved_pair` ha sido eliminado
    //println!("copia: {:?}", moved_pair);
    // TODO ^ Intenta descomentar esta línea

    // El resultado de.clone() todavía se puede usar!
    println!("clon: {:?}", cloned_pair);
}

Resumen

¡Felicidades! Has completado el laboratorio de Clone. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.