Typy złożone
Semantyka przenoszenia jest domyślna, ale niektóre typy są domyślnie kopiowane:
fn main() {
let x = 42;
let y = x;
println!("x: {x}"); // would not be accessible if not Copy
println!("y: {y}");
}
Te typy implementują cechę Copy.
Możesz spowodować żeby semantyka kopiowania była używana dla twoich własnych typów:
#[derive(Copy, Clone, Debug)]
struct Point(i32, i32);
fn main() {
let p1 = Point(3, 4);
let p2 = p1;
println!("p1: {p1:?}");
println!("p2: {p2:?}");
}
- Po przypisaniu, obydwie zmienne
p1ip2mają swoje dane na własność. - Możemy też użyć
p1.clone()żeby jawnie skopiować dane.
This slide should take about 5 minutes.
Kopiowanie i klonowanie to nie to samo:
- Kopiowanie odnosi się do bezpośredniego kopiowania pamięci i nie działa dla wszystkich obiektów.
- Kopiowanie nie pozwala na własną logikę (jak konstruktory kopiowania w C++).
- Klonowanie jest ogólniejszą operacją i pozwala na własne zachowanie poprzez implementację cechy
Clone. - Kopiowanie nie działa na typach, które implementują cechę
Drop.
W powyższym przykładzie spróbuj następującego:
- Dodaj pole
Stringdostruct Point. Nie skompiluje się boStringnie jest typemCopy. - Remove
Copyfrom thederiveattribute. The compiler error is now in theprintln!forp1. - Pokaż, że zadziała jeżeli zamiast tego sklonujesz
p1.