A Trait Display
Parte da seção Programação Orientada a Objetos do Journey de Rust da Coddy. Lição 36 de 61.
Embora Debug seja excelente para desenvolvedores que inspecionam dados, o trait Display foi projetado para saída voltada ao usuário. É ele que alimenta o formatador {} em println!. Ao contrário de Debug, Rust não pode derivar Display automaticamente. Você deve implementá-lo manualmente.
Para implementar Display, você precisa importar o módulo fmt e implementar o método fmt:
use std::fmt;
struct Temperature {
celsius: f64,
}
impl fmt::Display for Temperature {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}°C", self.celsius)
}
}
O método fmt recebe um Formatter e retorna um fmt::Result. Você usa a macro write! para formatar sua saída, acessando os campos da struct por meio de self.
Agora você pode imprimir a struct com o formatador padrão {}:
let temp = Temperature { celsius: 23.5 };
println!("{}", temp); // 23.5°C
A principal diferença: a saída de Debug mostra a estrutura dos seus dados (útil para depuração), enquanto a saída de Display é refinada e destinada aos usuários finais. Uma struct pode implementar ambos: use {:?} para depuração e {} para uma saída limpa.
Desafio
FácilVamos criar um sistema de exibição de produtos fácil de usar! Enquanto Debug mostra a estrutura bruta dos seus dados, o trait Display permite criar uma saída refinada e legível, perfeita para usuários finais.
Você organizará seu código em dois arquivos:
product.rs: defina uma struct públicaProductcom dois campos públicos:name(String) eprice(f64). Implemente o traitDisplaypara sua struct, para que ela seja formatada como{name} - ${price}. Lembre-se de importarstd::fmte usar a macrowrite!dentro do seu métodofmt.main.rs: importe seu módulo de produto e crie uma instância deProductusando as entradas fornecidas. Imprima o produto usando o formatador padrão{}para exibir sua saída personalizada.
O trait Display exige que você implemente manualmente o método fmt: Rust não pode derivá-lo automaticamente como faz com Debug. Isso oferece controle total sobre como seu tipo aparece para os usuários.
Sua saída deve exibir o produto em um formato limpo e fácil de usar:
{name} - ${price}Por exemplo, com as entradas Wireless Mouse e 29.99:
Wireless Mouse - $29.99Você receberá duas entradas: o nome do produto e o preço (faça o parse como f64).
Experimente você mesmo
mod product;
use product::Product;
fn main() {
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 price_input = String::new();
std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
let price: f64 = price_input.trim().parse().expect("Failed to parse price");
// TODO: Crie uma instância de Product com o name e o price
// TODO: Imprima o product usando o formatador {}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
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 PlayerPratique por conta própria: Compilador de Rust online