Das Clonen von Rust-Structs mit dem Clone-Trait

Beginner

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

Einführung

In diesem Lab lernen wir, wie wir das Clone-Trait in Rust verwenden, um Ressourcen wie Structs zu kopieren, indem wir die .clone()-Methode verwenden. Das Clone-Trait ermöglicht es uns, unabhängige Kopien von Ressourcen zu erstellen, und wir können die .clone()-Methode verwenden, um eine neue Instanz mit denselben Werten zu erstellen.

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.

Clone

Wenn es um Ressourcen geht, ist das Standardverhalten, sie während von Zuweisungen oder Funktionsaufrufen zu transferieren. Manchmal müssen wir jedoch auch eine Kopie der Ressource machen.

Das Clone-Trait hilft uns genau dabei. Am häufigsten können wir die von dem Clone-Trait definierte .clone()-Methode verwenden.

// Ein Unit-Struct ohne Ressourcen
#[derive(Debug, Clone, Copy)]
struct Unit;

// Ein Tuple-Struct mit Ressourcen, das das `Clone`-Trait implementiert
#[derive(Clone, Debug)]
struct Pair(Box<i32>, Box<i32>);

fn main() {
    // Instanziere `Unit`
    let unit = Unit;
    // Kopiere `Unit`, es gibt keine Ressourcen, die bewegt werden müssen
    let copied_unit = unit;

    // Beide `Unit`s können unabhängig voneinander verwendet werden
    println!("original: {:?}", unit);
    println!("Kopie: {:?}", copied_unit);

    // Instanziere `Pair`
    let pair = Pair(Box::new(1), Box::new(2));
    println!("original: {:?}", pair);

    // Bewege `pair` in `moved_pair`, bewegt die Ressourcen
    let moved_pair = pair;
    println!("bewegt: {:?}", moved_pair);

    // Fehler! `pair` hat seine Ressourcen verloren
    //println!("original: {:?}", pair);
    // TODO ^ Versuche, diese Zeile auszukommentieren

    // Klone `moved_pair` in `cloned_pair` (Ressourcen sind enthalten)
    let cloned_pair = moved_pair.clone();
    // Verwerfe das ursprüngliche Paar mit std::mem::drop
    drop(moved_pair);

    // Fehler! `moved_pair` wurde verworfen
    //println!("Kopie: {:?}", moved_pair);
    // TODO ^ Versuche, diese Zeile auszukommentieren

    // Das Ergebnis von.clone() kann immer noch verwendet werden!
    println!("Klon: {:?}", cloned_pair);
}

Zusammenfassung

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