A Trait Debug
Parte da seção Object Oriented Programming do Journey de Rust da Coddy — lição 35 de 61.
A biblioteca padrão do Rust vem com muitos traits pré-definidos que fornecem funcionalidades comuns. Um dos mais úteis para o desenvolvimento é o trait Debug, que permite imprimir o conteúdo de uma struct para inspeção.
Se você tentar imprimir uma struct personalizada diretamente, o Rust não saberá como exibi-la:
struct Player {
name: String,
score: u32,
}
let p = Player { name: String::from("Alice"), score: 100 };
println!("{:?}", p); // Error! Debug not implemented
O formatador {:?} requer a trait Debug. Em vez de implementá-la manualmente, o Rust fornece um atalho — o atributo #[derive]. Coloque-o diretamente acima da definição da sua struct:
#[derive(Debug)]
struct Player {
name: String,
score: u32,
}
let p = Player { name: String::from("Alice"), score: 100 };
println!("{:?}", p); // Player { name: "Alice", score: 100 }
O atributo #[derive(Debug)] diz ao compilador para gerar automaticamente a implementação Debug. Isso funciona desde que todos os campos em sua struct também implementem Debug (o que a maioria dos tipos padrão faz).
Para uma saída mais legível com estruturas aninhadas, use {:#?} para uma formatação amigável (pretty-printing):
println!("{:#?}", p);
// Player {
// name: "Alice",
// score: 100,
// }
Derivar Debug é essencial durante o desenvolvimento — ele permite que você inspecione rapidamente seus dados sem escrever código de formatação personalizado.
Desafio
FácilVamos tornar suas structs inspecionáveis derivando a trait Debug! Você criará um sistema de inventário simples onde os itens podem ser impressos para fins de depuração.
Você organizará seu código em dois arquivos:
inventory.rs: Defina uma struct públicaItemcom dois campos públicos:name(String) equantity(u32). Use o atributo#[derive(Debug)]para implementar automaticamente a trait Debug para sua struct.main.rs: Importe seu módulo de inventário e crie uma instância deItemusando as entradas fornecidas. Imprima o item usando o formatador de depuração{:?}para exibir sua estrutura interna.
A beleza de derivar Debug é que o Rust gera automaticamente o código de formatação para você — nenhuma implementação manual é necessária! Sua struct só precisa do atributo e ela se torna imprimível com {:?}.
Sua saída deve exibir o item no formato de depuração do Rust:
Item { name: "{name}", quantity: {quantity} }Por exemplo, com as entradas Keyboard e 15:
Item { name: "Keyboard", quantity: 15 }Você receberá duas entradas: o nome do item e a quantidade (converta para u32).
Folha de consulta
O trait Debug permite que você imprima o conteúdo de uma struct para inspeção usando o formatador {:?}.
Use o atributo #[derive(Debug)] para implementar automaticamente o Debug para sua struct:
#[derive(Debug)]
struct Player {
name: String,
score: u32,
}
let p = Player { name: String::from("Alice"), score: 100 };
println!("{:?}", p); // Player { name: "Alice", score: 100 }
Para uma saída formatada (pretty-printed) com melhor formatação, use {:#?}:
println!("{:#?}", p);
// Player {
// name: "Alice",
// score: 100,
// }
O atributo #[derive(Debug)] funciona desde que todos os campos em sua struct também implementem Debug, o que a maioria dos tipos padrão faz.
Experimente você mesmo
mod inventory;
use inventory::Item;
fn main() {
// Ler entrada
let mut name = String::new();
std::io::stdin().read_line(&mut name).expect("Failed to read line");
let name = name.trim().to_string();
let mut quantity_str = String::new();
std::io::stdin().read_line(&mut quantity_str).expect("Failed to read line");
let quantity: u32 = quantity_str.trim().parse().expect("Failed to parse quantity");
// TODO: Criar uma instância de Item com o nome e a quantidade fornecidos
// TODO: Imprimir o item usando o formatador de depuração {:?}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Object Oriented Programming
1Métodos e Comportamento
Introdução a Blocos de ImplementaçãoO Parâmetro SelfMétodos MutáveisFunções AssociadasMúltiplos Blocos de ImplementaçãoEncadeamento de MétodosRecapitulação - Ações de Retângulo4Projeto: Pet Virtual
Definindo o PetAlimentando o Pet7Traits Padrão
A Trait DebugA Trait DisplayClone e CopyTraits de IgualdadeRecapitulação - Ponto Imprimível10Projeto: Sistema de Documentos
A Trait DrawComponente de Texto2Encapsulamento e Módulos
Fundamentos de MódulosA Palavra-chave PublicCampos PrivadosGettersSettersRecapitulação - Cofre Seguro5Genéricos
Structs GenéricasMétodos GenéricosMúltiplos Tipos GenéricosFunções GenéricasRecapitulação - Ponto de Coordenada8Traits como Restrições
Sintaxe de Restrições de TraitRestrições MúltiplasA Cláusula WhereRetornando Tipos com TraitsRecapitulação - Impressora Genérica11Padrões de Projeto em Rust
Padrão NewtypeComposiçãoA Trait DropFrom e IntoRecapitulação - Mock de Smart Pointer3Enums Avançados
Enums com DadosMétodos em EnumsCorrespondência de Variantes de DadosO Enum Option RevisitadoRecapitulação - Enum Shape6Definição de Traits
O que é uma Trait?Implementando TraitsImplementações PadrãoSobrescrevendo PadrõesTraits com ParâmetrosRecapitulação - Media Player