Depuração
Todos os tipos que quiserem usar traits de formatação de std::fmt exigem que uma implementação seja imprimível. Implementações automáticas são apenas fornecidas para tipos tais como na biblioteca std. Todos os outros devem ser manualmente implementados de alguma maneira.
A trait de fmt::Debug torna isto muito direto. Todos os tipos podem derive (criar automaticamente) a implementação fmt::Debug. Isto não é verdadeiro para fmt::Display que deve ser implementada manualmente:
#![allow(unused)] fn main() { // Esta estrutura não pode ser impressa nem com `fmt::Display` ou // com `fmt::Debug`. struct UnPrintable(i32); // O atributo `derive` cria automaticamente a implementação exigida // para tornar esta `struct` imprimível com `fmt::Debug`. #[derive(Debug)] struct DebugPrintable(i32); }
Todos os tipos da biblioteca std são automaticamente imprimíveis também com {:?}:
// Derivar a implementação `fmt::Debug` para `Structure`. // `Structure` é uma estrutura que contém um único `i32`. #[derive(Debug)] struct Structure(i32); // Colocar uma `Structure` dentro da estrutura `Deep`. // Também a torna imprimível. #[derive(Debug)] struct Deep(Structure); fn main() { // Imprimir com `{:?}` é semelhante à com `{}`. println!("{:?} months in a year.", 12); println!("{1:?} {0:?} is the {actor:?} name.", "Slater", "Christian", actor="actor's"); // `Structure` é imprimível! println!("Now {:?} will print!", Structure(3)); // O problema com `derive` é que não existe controlo sobre // a aparência do resultado. E se quisermos que isto só mostre um `7`? println!("Now {:?} will print!", Deep(Structure(7))); }
Assim fmt::Debug definitivamente torna isto imprimível mas sacrifica alguma elegância. A Rust também fornece "impressão elegante" com {:#?}:
#[derive(Debug)] struct Person<'a> { name: &'a str, age: u8 } fn main() { let name = "Peter"; let age = 27; let peter = Person { name, age }; // Imprimir com elegância println!("{:#?}", peter); }
Um pode manualmente implementar fmt::Display para controlar a exibição.
Consulte também:
attributes, derive, std::fmt,
e struct