O Trait Default

O trait Default fornece uma implementação padrão para um tipo.

#[derive(Debug, Default)]
struct Derived {
    x: u32,
    y: String,
    z: Implemented,
}

#[derive(Debug)]
struct Implemented(String);

impl Default for Implemented {
    fn default() -> Self {
        Self("John Smith".into())
    }
}

fn main() {
    let default_struct = Derived::default();
    println!("{default_struct:#?}");

    let almost_default_struct =
        Derived { y: "Y está definido!".into(), ..Derived::default() };
    println!("{almost_default_struct:#?}");

    let nothing: Option<Derived> = None;
    println!("{:#?}", nothing.unwrap_or_default());
}
This slide should take about 5 minutes.
  • Ele pode ser implementado diretamente ou derivado usando #[derive(Default)].
  • A implementação usando derive produz um valor onde todos os campos são preenchidos com seus valores padrão.
    • Consequentemente, todos os tipos usados no struct devem implementar Default também.
  • Frequentemente, os tipos padrão do Rust implementam Default com valores razoáveis (p.ex.: 0, "", etc).
  • A inicialização parcial do struct funciona bem com o default.
  • A bilioteca padrão do Rust sabe que tipos podem implementar o trait Default e, convenientemente, provê métodos para isso.
  • A sintaxe .. é chamada de sintaxe de atualização de struct.