Copying and Cloning

    These types implement the trait.

    1. #[derive(Copy, Clone, Debug)]
    2. struct Point(i32, i32);
    3. fn main() {
    4. let p1 = Point(3, 4);
    5. println!("p1: {p1:?}");
    6. println!("p2: {p2:?}");
    • After the assignment, both p1 and p2 own their own data.
    • We can also use p1.clone() to explicitly copy the data.

    Copying and cloning are not the same thing:

    • Copying does not allow for custom logic (unlike copy constructors in C++).
    • Cloning is a more general operation and also allows for custom behavior by implementing the Clone trait.
    • Copying does not work on types that implement the Drop trait.
    • Add a String field to struct Point. It will not compile because String is not a type.
    • Remove Copy from the derive attribute. The compiler error is now in the println! for p1.

    If students ask about derive, it is sufficient to say that this is a way to generate code in Rust at compile time. In this case the default implementations of Copy and Clone traits are generated.