Grundlagen der Rust-Entleihungseigentumsverwaltung

RustRustBeginner
Jetzt üben

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

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab lernen wir über das Entleihen in Rust, das es ermöglicht, auf Daten zuzugreifen, ohne die Eigentumsgewalt zu übernehmen, indem Referenzen ('&T') verwendet werden, anstatt Objekte per Wert ('T') zu übergeben. Der Entleihprüfungsmechanismus gewährleistet, dass Referenzen immer auf gültige Objekte verweisen und verhindert die Zerstörung von Objekten, die entliehen werden.

Hinweis: Wenn im Lab kein Dateiname angegeben ist, können Sie einen beliebigen Dateinamen verwenden. Beispielsweise können Sie main.rs verwenden und es mit rustc main.rs &&./main kompilieren und ausführen.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) 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/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{{"Grundlagen der Rust-Entleihungseigentumsverwaltung"}} rust/integer_types -.-> lab-99198{{"Grundlagen der Rust-Entleihungseigentumsverwaltung"}} rust/function_syntax -.-> lab-99198{{"Grundlagen der Rust-Entleihungseigentumsverwaltung"}} rust/expressions_statements -.-> lab-99198{{"Grundlagen der Rust-Entleihungseigentumsverwaltung"}} rust/lifetime_specifiers -.-> lab-99198{{"Grundlagen der Rust-Entleihungseigentumsverwaltung"}} rust/method_syntax -.-> lab-99198{{"Grundlagen der Rust-Entleihungseigentumsverwaltung"}} rust/operator_overloading -.-> lab-99198{{"Grundlagen der Rust-Entleihungseigentumsverwaltung"}} end

Entleihen

In den meisten Fällen möchten wir auf Daten zugreifen, ohne die Eigentumsgewalt darüber zu übernehmen. Um dies zu erreichen, verwendet Rust ein Entleihmechanismus. Anstatt Objekte per Wert (T) zu übergeben, können Objekte per Referenz (&T) übergeben werden.

Der Compiler gewährleistet statisch (mittels seines Entleihprüfungsmechanismus), dass Referenzen immer auf gültige Objekte verweisen. Das heißt, solange Referenzen auf ein Objekt existieren, kann das Objekt nicht zerstört werden.

// Diese Funktion übernimmt die Eigentumsgewalt an einer Box und zerstört sie
fn eat_box_i32(boxed_i32: Box<i32>) {
    println!("Zerstöre Box, die enthält {}", boxed_i32);
}

// Diese Funktion entleiht ein i32
fn borrow_i32(borrowed_i32: &i32) {
    println!("Dieser int ist: {}", borrowed_i32);
}

fn main() {
    // Erzeuge eine boxingtes i32 und ein stapelgespeichertes i32
    let boxed_i32 = Box::new(5_i32);
    let stacked_i32 = 6_i32;

    // Entleihe den Inhalt der Box. Die Eigentumsgewalt wird nicht übernommen,
    // sodass der Inhalt erneut entliehen werden kann.
    borrow_i32(&boxed_i32);
    borrow_i32(&stacked_i32);

    {
        // Nehme eine Referenz auf den Inhalt der Box
        let _ref_to_i32: &i32 = &boxed_i32;

        // Fehler!
        // Kann `boxed_i32` nicht zerstören, solange der innere Wert später im Gültigkeitsbereich entliehen wird.
        eat_box_i32(boxed_i32);
        // FIXME ^ Kommentiere diese Zeile aus

        // Versuche, `_ref_to_i32` nach dem Zerstören des inneren Werts zu entleihen
        borrow_i32(_ref_to_i32);
        // `_ref_to_i32` verlässt den Gültigkeitsbereich und wird nicht mehr entliehen.
    }

    // `boxed_i32` kann jetzt die Eigentumsgewalt an `eat_box` übergeben und zerstört werden
    eat_box_i32(boxed_i32);
}

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das Entleih-Lab abgeschlossen. Sie können in LabEx weitere Labs absolvieren, um Ihre Fähigkeiten zu verbessern.