Menu
Coddy logo textTech

Resumen: Impresora genérica

Parte de la sección Programación Orientada a Objetos del Journey de Rust de Coddy. Lección 44 de 61.

challenge icon

Desafío

Fácil

¡Construyamos un sistema flexible de anuncios que demuestre el poder de los límites de rasgos! Crearás un rasgo Printable y una función genérica que pueda anunciar cualquier tipo que implemente este rasgo, mostrando cómo los genéricos y los rasgos 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 rasgo público Printable con un método print_info que toma &self y devuelve un String. Después, 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() sobre el elemento.
  • main.rs: Crea dos estructuras públicas que implementen Printable:
    • Person: con un campo público name (String). Su método print_info debe devolver Person: {name}
    • Product: con campos públicos name (String) y price (f64). Su método print_info debe devolver Product: {name} - ${price}
    Incluye tu módulo imprimible, usa las entradas para crear una Persona y un Producto, y después 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 una Persona, un Producto o cualquier tipo futuro. Solo requiere que el tipo pueda proporcionar información mediante print_info(). El límite del rasgo garantiza esto en tiempo de compilación.

Tu salida debe 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 name público (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() {
    // Lee las 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 el Person

    // TODO: Llama a announce con el Product
}

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Rust online