For some traits, the compiler itself knows how to implement them for a type. If we want them, we only have to tell it that we do, and it will take care of the rest for us.
We still have the option of manually implementing derivable traits, but that would usually just be a waste of time.
Telling the compiler that we want a data type to have a derivable trait is easy.
Here, we're telling it that we want our CopyExample enumeration to implement Copy and Clone:
#[derive(Copy, Clone)]
pub enum CopyExample {
Good,
Bad,
}
A trait can only be derived if the people who created the trait were able to write a program to generate the trait implementation. When we write #[derive(Copy, Clone)], we're telling the compiler to go find those programs for deriving Copy and Clone in the source code of the packages where the traits were defined, and run those...