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