Menu
Coddy logo textTech

Recapitulação - Impressora Genérica

Parte da seção Programação Orientada a Objetos do Journey de Rust da Coddy. Lição 44 de 61.

challenge icon

Desafio

Fácil

Vamos criar um sistema de anúncios flexível que demonstra o poder dos limites de traits! 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 aceite qualquer tipo T que implemente Printable. Essa função deve imprimir Announcement: {info}, em que {info} é o resultado da chamada de print_info() no item.
  • main.rs: Crie duas structs públicas que implementem 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}
    Inclua seu módulo printable, use as entradas para criar uma Person e um Product e, em seguida, chame announce com cada um deles para demonstrar que sua função genérica funciona com qualquer tipo Printable.

A beleza desse design é que announce não se importa se recebe uma Person, Product ou qualquer tipo futuro. Ela exige apenas que o tipo possa fornecer informações por meio de print_info(). O limite da trait garante isso em tempo de compilação.

Sua saída deve mostrar os dois 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 (converta para f64).

Experimente você mesmo

mod printable;

use printable::{Printable, announce};

// TODO: Defina uma struct pública Person com um campo name público (String)
// Implemente o 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 o trait Printable para Product
// print_info deve retornar "Product: {name} - ${price}"

fn main() {
    // Leia as 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: Crie uma instância de Person com person_name

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

    // TODO: Chame announce com o Person

    // TODO: Chame announce com o Product
}

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Rust online