9.10 Derived Traits and Common Operations
Traits define shared behavior. Rust’s #[derive] attribute automatically implements common traits, enabling standard operations on structs.
Commonly derived traits include:
Debug: Enables printing structs using{:?}(debug format). Essential for debugging. For user-facing output, implement theDisplaytrait manually.Clone: Enables creating deep copies via.clone(). Requires all fields to beClone.Copy: Enables implicit bitwise copying on assignment, function calls, etc. Structs can only beCopyif all their fields are alsoCopy. Assignment (let y = x;) movesxif the type is notCopy, but copiesxif it isCopy.PartialEq,Eq: Enable comparison (==,!=). Requires all fields to implement the respective trait(s).PartialOrd,Ord: Enable ordering (<,>, etc.). Requires all fields to implement the respective trait(s).Default: Enables creation of default instances. (Covered earlier).Hash: Allows use in hash maps/sets. Requires all fields to beHash.
Example Enabling Operations:
// Deriving traits enables common operations #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] struct SimplePoint { x: i32, y: i32, } fn main() { let p1 = SimplePoint { x: 1, y: 2 }; let p2 = p1; // **Assignment**: Copies p1 because SimplePoint is Copy let p3 = p1.clone(); // **Cloning**: Explicitly creates a copy println!("Debug print: {:?}", p1); // **Printing (Debug)** println!("Comparison: p1 == p2 is {}", p1 == p2); // **Comparison** (PartialEq) println!("Ordering: p1 < p3 is {}", p1 < p3); // **Ordering** (PartialOrd) use std::collections::HashSet; let mut points = HashSet::new(); points.insert(p1); // **Hashing** (Hash + Eq required for HashSet) println!("Set contains p1: {}", points.contains(&p1)); }
Deriving traits is idiomatic for providing standard behaviors concisely. Manually implementing traits offers customization when needed.