Partielle Verschiebung bei der Destrukturierung in Rust

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 partielle Verschiebungen innerhalb der Destrukturierung einer einzelnen Variable, bei der sowohl by-move- als auch by-reference-Musterbindungen gleichzeitig verwendet werden können. Dies führt zu einer partiellen Verschiebung der Variable, wodurch einige Teile verschoben werden können, während andere weiterhin referenziert werden können. Wenn eine übergeordnete Variable partiell verschoben wird, kann sie danach nicht mehr als Ganzes verwendet werden, aber die Teile, die nur referenziert und nicht verschoben werden, können weiterhin verwendet werden.

Hinweis: Wenn das Lab keinen Dateinamen angibt, 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/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) 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/DataTypesGroup -.-> rust/string_type("String Type") rust/DataTypesGroup -.-> rust/type_casting("Type Conversion and Casting") 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-99197{{"Partielle Verschiebung bei der Destrukturierung in Rust"}} rust/integer_types -.-> lab-99197{{"Partielle Verschiebung bei der Destrukturierung in Rust"}} rust/string_type -.-> lab-99197{{"Partielle Verschiebung bei der Destrukturierung in Rust"}} rust/type_casting -.-> lab-99197{{"Partielle Verschiebung bei der Destrukturierung in Rust"}} rust/function_syntax -.-> lab-99197{{"Partielle Verschiebung bei der Destrukturierung in Rust"}} rust/expressions_statements -.-> lab-99197{{"Partielle Verschiebung bei der Destrukturierung in Rust"}} rust/lifetime_specifiers -.-> lab-99197{{"Partielle Verschiebung bei der Destrukturierung in Rust"}} rust/method_syntax -.-> lab-99197{{"Partielle Verschiebung bei der Destrukturierung in Rust"}} rust/operator_overloading -.-> lab-99197{{"Partielle Verschiebung bei der Destrukturierung in Rust"}} end

Partielle Verschiebungen

Innerhalb der [Destrukturierung] einer einzelnen Variable können sowohl by-move- als auch by-reference-Musterbindungen gleichzeitig verwendet werden. Dadurch wird eine partielle Verschiebung der Variable durchgeführt, was bedeutet, dass Teile der Variable verschoben werden, während andere Teile bleiben. In einem solchen Fall kann die übergeordnete Variable danach nicht mehr als Ganzes verwendet werden, jedoch können die Teile, die nur referenziert (und nicht verschoben) werden, weiterhin verwendet werden.

fn main() {
    #[derive(Debug)]
    struct Person {
        name: String,
        age: Box<u8>,
    }

    let person = Person {
        name: String::from("Alice"),
        age: Box::new(20),
    };

    // `name` wird aus `person` herausverschoben, aber `age` wird referenziert
    let Person { name, ref age } = person;

    println!("The person's age is {}", age);

    println!("The person's name is {}", name);

    // Fehler! Zugriff auf teilweise verschobenen Wert: `person` partielle Verschiebung auftritt
    //println!("The person struct is {:?}", person);

    // `person` kann nicht verwendet werden, aber `person.age` kann verwendet werden, da es nicht verschoben wird
    println!("The person's age from person struct is {}", person.age);
}

(In diesem Beispiel speichern wir die Variable age auf dem Heap, um die partielle Verschiebung zu veranschaulichen: Wenn man ref im obigen Code löscht, tritt ein Fehler auf, da die Eigentumsgewalt von person.age an die Variable age übergeben würde. Wenn Person.age auf dem Stack gespeichert wäre, wäre ref nicht erforderlich, da die Definition von age die Daten von person.age kopieren würde, ohne sie zu verschieben.)

Zusammenfassung

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