Clone トレイトを使った Rust 構造体のクローニング

RustRustBeginner
今すぐ練習

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

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

はじめに

この実験では、Rust の Clone トレイトを使って構造体などのリソースをコピーする方法を学びます。.clone() メソッドを使って、Clone トレイトは私たちにリソースの独立したコピーを作成することができ、.clone() メソッドを使って同じ値を持つ新しいインスタンスを作成することができます。

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust(("Rust")) -.-> rust/AdvancedTopicsGroup(["Advanced Topics"]) rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) 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/DataStructuresandEnumsGroup -.-> rust/method_syntax("Method Syntax") rust/AdvancedTopicsGroup -.-> rust/operator_overloading("Traits for Operator Overloading") subgraph Lab Skills rust/variable_declarations -.-> lab-99220{{"Clone トレイトを使った Rust 構造体のクローニング"}} rust/integer_types -.-> lab-99220{{"Clone トレイトを使った Rust 構造体のクローニング"}} rust/function_syntax -.-> lab-99220{{"Clone トレイトを使った Rust 構造体のクローニング"}} rust/expressions_statements -.-> lab-99220{{"Clone トレイトを使った Rust 構造体のクローニング"}} rust/method_syntax -.-> lab-99220{{"Clone トレイトを使った Rust 構造体のクローニング"}} rust/operator_overloading -.-> lab-99220{{"Clone トレイトを使った Rust 構造体のクローニング"}} end

Clone

リソースを扱う際、代入や関数呼び出し時の既定の動作は、それらを移すことです。しかし、時にはリソースのコピーも必要になります。

Clone トレイトは、まさにこれを可能にします。最も一般的には、Clone トレイトによって定義された .clone() メソッドを使用します。

// リソースのないユニット構造体
#[derive(Debug, Clone, Copy)]
struct Unit;

// `Clone` トレイトを実装するリソースを持つタプル構造体
#[derive(Clone, Debug)]
struct Pair(Box<i32>, Box<i32>);

fn main() {
    // `Unit` をインスタンス化
    let unit = Unit;
    // `Unit` をコピーする。移動するリソースはない
    let copied_unit = unit;

    // 両方の `Unit` は独立して使用できる
    println!("original: {:?}", unit);
    println!("copy: {:?}", copied_unit);

    // `Pair` をインスタンス化
    let pair = Pair(Box::new(1), Box::new(2));
    println!("original: {:?}", pair);

    // `pair` を `moved_pair` に移動する。リソースを移動する
    let moved_pair = pair;
    println!("moved: {:?}", moved_pair);

    // エラー!`pair` はリソースを失っている
    //println!("original: {:?}", pair);
    // TODO ^ この行のコメントを外してみる

    // `moved_pair` を `cloned_pair` にクローンする(リソースも含む)
    let cloned_pair = moved_pair.clone();
    // 元のペアを std::mem::drop を使って破棄する
    drop(moved_pair);

    // エラー!`moved_pair` は既に破棄されている
    //println!("copy: {:?}", moved_pair);
    // TODO ^ この行のコメントを外してみる

    // `.clone()` の結果は依然として使用できる!
    println!("clone: {:?}", cloned_pair);
}

まとめ

おめでとうございます!あなたは Clone 実験を完了しました。あなたのスキルを向上させるために、LabEx でさらに多くの実験を練習することができます。