Tipos CopiĂĄveis

Embora a semĂąntica de movimento seja o padrĂŁo, certos tipos sĂŁo copiados por padrĂŁo:

fn main() {
    let x = 42;
    let y = x;
    println!("x: {x}"); // would not be accessible if not Copy
    println!("y: {y}");
}

Esses tipos implementam o trait Copy.

VocĂȘ pode habilitar seus prĂłprios tipos para usar a semĂąntica de cĂłpia:

#[derive(Copy, Clone, Debug)]
struct Point(i32, i32);

fn main() {
    let p1 = Point(3, 4);
    let p2 = p1;
    println!("p1: {p1:?}");
    println!("p2: {p2:?}");
}
  • ApĂłs a atribuição, tanto p1 quanto p2 possuem seus prĂłprios dados.
  • TambĂ©m podemos usar p1.clone() para copiar os dados explicitamente.
This slide should take about 5 minutes.

Copia e clonagem nĂŁo sĂŁo a mesma coisa:

  • CĂłpia refere-se a cĂłpias bit a bit de regiĂ”es de memĂłria e nĂŁo funciona em objetos arbitrĂĄrios.
  • CĂłpia nĂŁo permite lĂłgica personalizada (ao contrĂĄrio dos construtores de cĂłpia em C++).
  • Clonagem Ă© uma operação mais geral e tambĂ©m permite um comportamento personalizado atravĂ©s da implementação do trait Clone.
  • CĂłpia nĂŁo funciona em tipos que implementam o trait Drop.

No exemplo acima, tente o seguinte:

  • Adicione um campo String ao struct Point. Ele nĂŁo irĂĄ compilar porque String nĂŁo Ă© um tipo Copy.
  • Remova Copy do atributo derive. O erro do compilador agora estĂĄ no println! para p1.
  • Mostre que ele funciona se ao invĂ©s disso vocĂȘ clonar p1.