Menu
Coddy logo textTech

Resumen: Impresora genérica

Parte de la sección Object Oriented Programming del Journey de Rust de Coddy — lección 44 de 61.

challenge icon

Desafío

Fácil

¡Vamos a construir un sistema de anuncios flexible que demuestre el poder de los trait bounds! Crearás un trait Printable y una función genérica que pueda anunciar cualquier tipo que implemente este trait, mostrando cómo los genéricos y los traits trabajan juntos para crear código reutilizable y seguro en cuanto a tipos.

Organizarás tu código en dos archivos:

  • printable.rs: Define un trait público Printable con un método print_info que tome &self y devuelva un String. Luego, crea una función genérica pública llamada announce que acepte cualquier tipo T que implemente Printable. Esta función debe imprimir Announcement: {info} donde {info} es el resultado de llamar a print_info() en el elemento.
  • main.rs: Crea dos structs públicos que implementen Printable:
    • Person — con un campo público name (String). Su print_info debe devolver Person: {name}
    • Product — con campos públicos name (String) y price (f64). Su print_info debe devolver Product: {name} - ${price}
    Importa tu módulo printable, usa las entradas para crear un Person y un Product, luego llama a announce con cada uno para demostrar que tu función genérica funciona con cualquier tipo Printable.

La belleza de este diseño es que a announce no le importa si recibe un Person, un Product o cualquier tipo futuro; solo requiere que el tipo pueda proporcionar información a través de print_info(). El trait bound garantiza esto en tiempo de compilación.

Tu salida debería mostrar ambos anuncios:

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

Por ejemplo, con las entradas Alice, Laptop, y 999.99:

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

Recibirás tres entradas: el nombre de la persona, el nombre del producto y el precio del producto (analízalo como f64).

Pruébalo tú mismo

mod printable;

use printable::{Printable, announce};

// TODO: Define una struct pública Person con un campo público name (String)
// Implementa el trait Printable para Person
// print_info debe devolver "Person: {name}"

// TODO: Define una struct pública Product con campos públicos name (String) y price (f64)
// Implementa el trait Printable para Product
// print_info debe devolver "Product: {name} - ${price}"

fn main() {
    // Leer 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: Crea una instancia de Person con person_name

    // TODO: Crea una instancia de Product con product_name y price

    // TODO: Llama a announce con la Person

    // TODO: Llama a announce con el Product
}

Todas las lecciones de Object Oriented Programming