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
.
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.