Clonando Structs Rust com o Trait Clone

Beginner

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

Introdução

Neste laboratório, aprendemos sobre o uso do trait Clone em Rust para fazer cópias de recursos, como structs, usando o método .clone(). O trait Clone nos permite criar cópias independentes de recursos, e podemos usar o método .clone() para criar uma nova instância com os mesmos valores.

Nota: Se o laboratório não especificar um nome de arquivo, você pode usar qualquer nome de arquivo que desejar. Por exemplo, você pode usar main.rs, compilar e executá-lo com rustc main.rs && ./main.

Clone (Clonar)

Ao lidar com recursos, o comportamento padrão é transferi-los durante atribuições ou chamadas de função. No entanto, às vezes precisamos também fazer uma cópia do recurso.

O trait Clone nos ajuda a fazer exatamente isso. Mais comumente, podemos usar o método .clone() definido pelo trait Clone.

// A unit struct without resources
#[derive(Debug, Clone, Copy)]
struct Unit;

// A tuple struct with resources that implements the `Clone` trait
#[derive(Clone, Debug)]
struct Pair(Box<i32>, Box<i32>);

fn main() {
    // Instantiate `Unit`
    let unit = Unit;
    // Copy `Unit`, there are no resources to move
    let copied_unit = unit;

    // Both `Unit`s can be used independently
    println!("original: {:?}", unit);
    println!("copy: {:?}", copied_unit);

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

    // Move `pair` into `moved_pair`, moves resources
    let moved_pair = pair;
    println!("moved: {:?}", moved_pair);

    // Error! `pair` has lost its resources
    //println!("original: {:?}", pair);
    // TODO ^ Try uncommenting this line

    // Clone `moved_pair` into `cloned_pair` (resources are included)
    let cloned_pair = moved_pair.clone();
    // Drop the original pair using std::mem::drop
    drop(moved_pair);

    // Error! `moved_pair` has been dropped
    //println!("copy: {:?}", moved_pair);
    // TODO ^ Try uncommenting this line

    // The result from .clone() can still be used!
    println!("clone: {:?}", cloned_pair);
}

Resumo

Parabéns! Você concluiu o laboratório de Clone. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.