The Default Trait

Default trait produces a default value for a type.

  1. #[derive(Debug, Default)]
  2. struct Derived {
  3.     x: u32,
  4.     y: String,
  5.     z: Implemented,
  6. }
  7. #[derive(Debug)]
  8. struct Implemented(String);
  9. impl Default for Implemented {
  10.     fn default() -> Self {
  11.         Self("John Smith".into())
  12.     }
  13. }
  14. fn main() {
  15.     let default_struct = Derived::default();
  16.     println!("{default_struct:#?}");
  17.     let almost_default_struct =
  18.         Derived { y: "Y is set!".into(), ..Derived::default() };
  19.     println!("{almost_default_struct:#?}");
  20.     let nothing: Option<Derived> = None;
  21.     println!("{:#?}", nothing.unwrap_or_default());
  22. }

This slide should take about 5 minutes.

  • It can be implemented directly or it can be derived via #[derive(Default)].
  • A derived implementation will produce a value where all fields are set to their default values.
    • This means all types in the struct must implement Default too.
  • Standard Rust types often implement Default with reasonable values (e.g. 0, "", etc).
  • The partial struct initialization works nicely with default.
  • The Rust standard library is aware that types can implement Default and provides convenience methods that use it.
  • The .. syntax is called struct update syntax.