Rust の本における可変借用

RustRustBeginner
今すぐ練習

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

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

はじめに

この実験では、本の構造体の例を使って、可変参照と不変参照を通じたデータの借用の概念を調べることで、Rust における可変性を探ります。この構造体には、可変借用と不変借用の動作を示す関数があります。

注: 実験でファイル名が指定されていない場合、好きなファイル名を使うことができます。たとえば、main.rs を使って、rustc main.rs &&./main でコンパイルして実行することができます。


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/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/BasicConceptsGroup -.-> rust/mutable_variables("Mutable Variables") 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") subgraph Lab Skills rust/variable_declarations -.-> lab-99199{{"Rust の本における可変借用"}} rust/mutable_variables -.-> lab-99199{{"Rust の本における可変借用"}} rust/integer_types -.-> lab-99199{{"Rust の本における可変借用"}} rust/string_type -.-> lab-99199{{"Rust の本における可変借用"}} rust/type_casting -.-> lab-99199{{"Rust の本における可変借用"}} rust/function_syntax -.-> lab-99199{{"Rust の本における可変借用"}} rust/expressions_statements -.-> lab-99199{{"Rust の本における可変借用"}} end

可変性

可変データは &mut T を使って可変的に借用できます。これは 可変参照 と呼ばれ、借用者に読み書きアクセスを与えます。対照的に、&T は不変参照を通じてデータを借用し、借用者はデータを読むことはできますが、変更することはできません。

#[allow(dead_code)]
#[derive(Clone, Copy)]
struct Book {
    // `&'static str` は読み取り専用メモリに割り当てられた文字列への参照
    author: &'static str,
    title: &'static str,
    year: u32,
}

// この関数は本への参照を受け取ります
fn borrow_book(book: &Book) {
    println!("I immutably borrowed {} - {} edition", book.title, book.year);
}

// この関数は可変な本への参照を受け取り、`year` を 2014 に変更します
fn new_edition(book: &mut Book) {
    book.year = 2014;
    println!("I mutably borrowed {} - {} edition", book.title, book.year);
}

fn main() {
    // 不変の本 `immutabook` を作成します
    let immutabook = Book {
        // 文字列リテラルは `&'static str` 型を持ちます
        author: "Douglas Hofstadter",
        title: "Gödel, Escher, Bach",
        year: 1979,
    };

    // `immutabook` の可変コピーを作成し、`mutabook` と呼びます
    let mut mutabook = immutabook;

    // 不変オブジェクトを不変的に借用します
    borrow_book(&immutabook);

    // 可変オブジェクトを不変的に借用します
    borrow_book(&mutabook);

    // 可変オブジェクトを可変的に借用します
    new_edition(&mut mutabook);

    // エラー!不変オブジェクトを可変的に借用することはできません
    new_edition(&mut immutabook);
    // FIXME ^ この行をコメントアウトしてください
}

まとめ

おめでとうございます!あなたは可変性の実験を完了しました。あなたの技術を向上させるために、LabExでさらに多くの実験を行って練習してください。