Fundamentos del préstamo de propiedad en Rust

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 sobre el préstamo en Rust, que permite acceder a datos sin tomar posesión de ellos mediante el uso de referencias ('&T') en lugar de pasar objetos por valor ('T'). El verificador de préstamos asegura que las referencias siempre apunten a objetos válidos y evita la destrucción de objetos que se están prestando.

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/MemorySafetyandManagementGroup(["Memory Safety and Management"]) 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/MemorySafetyandManagementGroup -.-> rust/lifetime_specifiers("Lifetime Specifiers") rust/DataStructuresandEnumsGroup -.-> rust/method_syntax("Method Syntax") rust/AdvancedTopicsGroup -.-> rust/operator_overloading("Traits for Operator Overloading") subgraph Lab Skills rust/variable_declarations -.-> lab-99198{{"Fundamentos del préstamo de propiedad en Rust"}} rust/integer_types -.-> lab-99198{{"Fundamentos del préstamo de propiedad en Rust"}} rust/function_syntax -.-> lab-99198{{"Fundamentos del préstamo de propiedad en Rust"}} rust/expressions_statements -.-> lab-99198{{"Fundamentos del préstamo de propiedad en Rust"}} rust/lifetime_specifiers -.-> lab-99198{{"Fundamentos del préstamo de propiedad en Rust"}} rust/method_syntax -.-> lab-99198{{"Fundamentos del préstamo de propiedad en Rust"}} rust/operator_overloading -.-> lab-99198{{"Fundamentos del préstamo de propiedad en Rust"}} end

Préstamo

En la mayoría de los casos, queremos acceder a datos sin tomar posesión de ellos. Para lograr esto, Rust utiliza un mecanismo de préstamo. En lugar de pasar objetos por valor (T), los objetos se pueden pasar por referencia (&T).

El compilador garantiza en forma estática (a través de su verificador de préstamos) que las referencias siempre apunten a objetos válidos. Es decir, mientras existan referencias a un objeto, el objeto no puede ser destruido.

// Esta función toma posesión de una caja y la destruye
fn eat_box_i32(boxed_i32: Box<i32>) {
    println!("Destruyendo caja que contiene {}", boxed_i32);
}

// Esta función presta un i32
fn borrow_i32(borrowed_i32: &i32) {
    println!("Este entero es: {}", borrowed_i32);
}

fn main() {
    // Crea una caja con un i32, y un i32 en la pila
    let boxed_i32 = Box::new(5_i32);
    let stacked_i32 = 6_i32;

    // Presta el contenido de la caja. No se toma posesión,
    // por lo que el contenido se puede prestar nuevamente.
    borrow_i32(&boxed_i32);
    borrow_i32(&stacked_i32);

    {
        // Toma una referencia al dato contenido dentro de la caja
        let _ref_to_i32: &i32 = &boxed_i32;

        // Error!
        // No se puede destruir `boxed_i32` mientras el valor interno esté prestado más adelante en el ámbito.
        eat_box_i32(boxed_i32);
        // FIXME ^ Comenta esta línea

        // Intenta prestar `_ref_to_i32` después de que el valor interno sea destruido
        borrow_i32(_ref_to_i32);
        // `_ref_to_i32` sale del ámbito y ya no está prestado.
    }

    // `boxed_i32` ahora puede entregar la posesión a `eat_box` y ser destruido
    eat_box_i32(boxed_i32);
}

Resumen

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