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.

Mais para Explorar

  • ReferĂȘncias compartilhadas sĂŁo Copy/Clone, referĂȘncias mutĂĄveis nĂŁo. Isso porque Rust requer que referĂȘncias mutĂĄveis sejam exclusivas, entĂŁo, embora seja vĂĄlido fazer uma cĂłpia de uma referĂȘncia compartilhada, criar uma cĂłpia de uma referĂȘncia mutĂĄvel violaria as regras de emprĂ©stimo do Rust.