Menu
Coddy logo textTech

Recapitulação - Impressora Genérica

Parte da seção Object Oriented Programming do Journey de Rust da Coddy — lição 44 de 61.

challenge icon

Desafio

Fácil

Vamos construir um sistema de anúncios flexível que demonstra o poder dos trait bounds! Você criará uma trait Printable e uma função genérica que pode anunciar qualquer tipo que implemente essa trait—mostrando como genéricos e traits trabalham juntos para criar código reutilizável e seguro quanto aos tipos.

Você organizará seu código em dois arquivos:

  • printable.rs: Defina uma trait pública Printable com um método print_info que recebe &self e retorna uma String. Em seguida, crie uma função genérica pública chamada announce que aceita qualquer tipo T que implemente Printable. Esta função deve imprimir "Announcement: {info}" onde {info} é o resultado da chamada de print_info() no item.
  • main.rs: Crie duas structs públicas que implementam Printable:
    • Person — com um campo público name (String). Seu print_info deve retornar "Person: {name}"
    • Product — com campos públicos name (String) e price (f64). Seu print_info deve retornar "Product: {name} - ${price}"
    Importe seu módulo printable, use as entradas para criar um Person e um Product, e então chame announce com cada um para demonstrar que sua função genérica funciona com qualquer tipo Printable.

A beleza deste design é que announce não se importa se recebe um Person, Product ou qualquer tipo futuro—ele apenas exige que o tipo possa fornecer informações através de print_info(). O trait bound garante isso em tempo de compilação.

Sua saída deve mostrar ambos os anúncios:

Announcement: Person: {name}
Announcement: Product: {product_name} - ${price}

Por exemplo, com as entradas "Alice", "Laptop", e "999.99":

Announcement: Person: Alice
Announcement: Product: Laptop - $999.99

Você receberá três entradas: o nome da pessoa, o nome do produto e o preço do produto (analise como f64).

Experimente você mesmo

mod printable;

use printable::{Printable, announce};

// TODO: Defina uma struct pública Person com um campo público name (String)
// Implemente a trait Printable para Person
// print_info deve retornar "Person: {name}"

// TODO: Defina uma struct pública Product com campos públicos name (String) e price (f64)
// Implemente a trait Printable para Product
// print_info deve retornar "Product: {name} - ${price}"

fn main() {
    // Ler entradas
    let mut person_name = String::new();
    std::io::stdin().read_line(&mut person_name).expect("Failed to read line");
    let person_name = person_name.trim().to_string();

    let mut product_name = String::new();
    std::io::stdin().read_line(&mut product_name).expect("Failed to read line");
    let product_name = product_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: Criar uma instância de Person com person_name

    // TODO: Criar uma instância de Product com product_name e price

    // TODO: Chamar announce com a Person

    // TODO: Chamar announce com o Product
}

Todas as lições de Object Oriented Programming