Menu
Coddy logo textTech

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.

challenge icon

Desafio

Fácil

Vamos 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ública Product com dois campos públicos: name (String) e price (f64). Implemente o trait Display para sua struct, para que ela seja formatada como {name} - ${price}. Lembre-se de importar std::fmt e usar a macro write! dentro do seu método fmt.
  • main.rs: importe seu módulo de produto e crie uma instância de Product usando 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.99

Você 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 {}
}
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de Rust online