Menu
Coddy logo textTech

Catálogo de biblioteca

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

challenge icon

Desafío

Fácil

¡Vamos a construir un sistema de catálogo de biblioteca que demuestre cómo los traits unifican diferentes tipos bajo una interfaz común! Crearás un catálogo donde los libros y las revistas, a pesar de tener diferentes propiedades, puedan describirse a sí mismos a través de 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 structs que implementen tu trait. Un Book tiene un title y author (ambos Strings), mientras que un Magazine tiene un name (String) y un número de issue (u32). Cada struct debe implementar CatalogItem con su propio formato de descripción único.
  • main.rs: Importa ambos módulos y crea instancias de Book y Magazine utilizando las entradas proporcionadas. Llama al método description en cada elemento e imprime los resultados.

Tu descripción de Book debe seguir este formato:

Book: {title} by {author}

Tu descripción de 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 (analiza este último como 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: Crear una instancia de Book usando book_title y book_author

    // TODO: Crear una instancia de Magazine usando magazine_name y magazine_issue

    // TODO: Llamar a description() en cada elemento e imprimir los resultados
}

Todas las lecciones de Object Oriented Programming