diff --git a/src/methods-and-traits/deriving.md b/src/methods-and-traits/deriving.md index 1cc2bb6f..1c27e407 100644 --- a/src/methods-and-traits/deriving.md +++ b/src/methods-and-traits/deriving.md @@ -26,8 +26,28 @@ fn main() {
-Derivation is implemented with macros, and many crates provide useful derive -macros to add useful functionality. For example, `serde` can derive -serialization support for a struct using `#[derive(Serialize)]`. +- Derivation is implemented with macros, and many crates provide useful derive + macros to add useful functionality. For example, `serde` can derive + serialization support for a struct using `#[derive(Serialize)]`. + +- Derivation is usually provided for traits that have a common boilerplate-y + implementation that is correct for most cases. For example, demonstrate how a + manual `Clone` impl can be repetitive compared to deriving the trait: + + ```rust,ignore + impl Clone for Player { + fn clone(&self) -> Self { + Player { + name: self.name.clone(), + strength: self.strength.clone(), + hit_points: self.hit_points.clone(), + } + } + } + ``` + + Not all of the `.clone()`s in the above are necessary in this case, but this + demonstrates the generally boilerplate-y pattern that manual impls would + follow, which should help make the use of `derive` clear to students.