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
quantop2
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
aostruct Point
. Ele nĂŁo irĂĄ compilar porqueString
nĂŁo Ă© um tipoCopy
. - Remova
Copy
do atributoderive
. O erro do compilador agora estĂĄ noprintln!
parap1
. - Mostre que ele funciona se ao invĂ©s disso vocĂȘ clonar
p1
.