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:
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ânciaprintln!("{:#?}", peter);}
Um pode manualmente implementar fmt::Display
para controlar a exibição.
Consulte também:
attributes
, derive
, std::fmt
,
e struct