Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 p1 i p2 mają 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 String do struct Point. Nie skompiluje się bo String nie jest typem Copy.
  • Remove Copy from the derive attribute. The compiler error is now in the println! for p1.
  • Pokaż, że zadziała jeżeli zamiast tego sklonujesz p1.