Menu
Coddy logo textTech

Catálogo de biblioteca

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

challenge icon

Desafío

Fácil

¡Construyamos un sistema de catálogo de biblioteca que demuestre cómo los traits unifican distintos tipos bajo una interfaz común! Crearás un catálogo en el que los libros y las revistas, a pesar de tener propiedades diferentes, puedan describirse mediante un trait compartido.

Organizarás tu código en tres archivos:

  • catalog.rs: Define el trait CatalogItem con un único método description que devuelve un String. Este trait establece el contrato que todos los elementos de la biblioteca deben cumplir.
  • items.rs: Crea dos estructuras que implementen tu trait. Un Book tiene un title y un author (ambos son Strings), mientras que un Magazine tiene un name (String) y un número de issue (u32). Cada estructura debe implementar CatalogItem con su propio formato de descripción único.
  • main.rs: Incorpora ambos módulos y crea instancias de Book y Magazine usando las entradas proporcionadas. Llama al método description en cada elemento e imprime los resultados.

La descripción de tu Book debe seguir este formato:

Book: {title} by {author}

La descripción de tu Magazine debe seguir este formato:

Magazine: {name}, Issue {issue}

Por ejemplo, con las entradas 1984, George Orwell, Nature y 42:

Book: 1984 by George Orwell
Magazine: Nature, Issue 42

Y con las entradas The Rust Book, Steve Klabnik, Science Weekly y 156:

Book: The Rust Book by Steve Klabnik
Magazine: Science Weekly, Issue 156

Recibirás cuatro entradas: el título del libro, el autor del libro, el nombre de la revista y el número de edición de la revista (convierte el último a u32).

Pruébalo tú mismo

mod catalog;
mod items;

use catalog::CatalogItem;
use items::{Book, Magazine};

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

    let mut book_author = String::new();
    std::io::stdin().read_line(&mut book_author).expect("Failed to read line");
    let book_author = book_author.trim().to_string();

    let mut magazine_name = String::new();
    std::io::stdin().read_line(&mut magazine_name).expect("Failed to read line");
    let magazine_name = magazine_name.trim().to_string();

    let mut issue_input = String::new();
    std::io::stdin().read_line(&mut issue_input).expect("Failed to read line");
    let magazine_issue: u32 = issue_input.trim().parse().expect("Failed to parse issue number");

    // TODO: Crea una instancia de Book usando book_title y book_author

    // TODO: Create a Magazine instance using magazine_name and magazine_issue

    // TODO: Llama a description() en cada ítem e imprime los resultados
}

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Rust online