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

Pratique por conta própria: Compilador de Rust online