Rust における部分的なムーブ分解構文

RustRustBeginner
今すぐ練習

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

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、単一の変数の分解構文における部分的なムーブについて学びます。ここでは、by-moveby-reference の両方のパターンバインディングを同時に使用できます。これにより、変数の部分的なムーブが行われ、一部の部分がムーブされる一方で、他の部分は依然として参照できるようになります。親変数が部分的にムーブされた場合、その後は全体として使用できなくなりますが、参照のみされてムーブされなかった部分は依然として使用できます。

注: 実験でファイル名が指定されていない場合は、好きなファイル名を使用できます。たとえば、main.rs を使用して、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/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/MemorySafetyandManagementGroup(["Memory Safety and Management"]) 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{{"Rust における部分的なムーブ分解構文"}} rust/integer_types -.-> lab-99197{{"Rust における部分的なムーブ分解構文"}} rust/string_type -.-> lab-99197{{"Rust における部分的なムーブ分解構文"}} rust/type_casting -.-> lab-99197{{"Rust における部分的なムーブ分解構文"}} rust/function_syntax -.-> lab-99197{{"Rust における部分的なムーブ分解構文"}} rust/expressions_statements -.-> lab-99197{{"Rust における部分的なムーブ分解構文"}} rust/lifetime_specifiers -.-> lab-99197{{"Rust における部分的なムーブ分解構文"}} rust/method_syntax -.-> lab-99197{{"Rust における部分的なムーブ分解構文"}} rust/operator_overloading -.-> lab-99197{{"Rust における部分的なムーブ分解構文"}} end

部分的なムーブ

単一の変数の[分解構文]内では、by-moveby-reference の両方のパターンバインディングを同時に使用できます。これを行うと、変数の 部分的なムーブ が行われます。これは、変数の一部がムーブされる一方で、他の部分は残ることを意味します。この場合、親変数はその後は全体として使用できませんが、参照のみされている(ムーブされていない)部分は依然として使用できます。

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

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

    // `name` は person からムーブされますが、`age` は参照されます
    let Person { name, ref age } = person;

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

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

    // エラー!部分的にムーブされた値の借用: `person` 部分的なムーブが発生します
    //println!("The person struct is {:?}", person);

    // `person` は使用できませんが、`person.age` はムーブされていないため使用できます
    println!("The person's age from person struct is {}", person.age);
}

(この例では、部分的なムーブを示すために age 変数をヒープ上に格納しています。上記のコードで ref を削除すると、person.age の所有権が変数 age にムーブされるため、エラーが発生します。もし Person.age がスタック上に格納されていた場合、age の定義が person.age からデータをコピーしてムーブしないため、ref は必要ありません。)

まとめ

おめでとうございます!あなたは「部分的なムーブ」の実験を完了しました。あなたの技術を向上させるために、LabExでさらに多くの実験を行って練習してください。