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.
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 traitCatalogItemcon un único métododescriptionque devuelve unString. Este trait establece el contrato que todos los elementos de la biblioteca deben cumplir.items.rs: Crea dos estructuras que implementen tu trait. UnBooktiene untitley unauthor(ambos son Strings), mientras que unMagazinetiene unname(String) y un número deissue(u32). Cada estructura debe implementarCatalogItemcon 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étododescriptionen 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 42Y con las entradas The Rust Book, Steve Klabnik, Science Weekly y 156:
Book: The Rust Book by Steve Klabnik
Magazine: Science Weekly, Issue 156Recibirá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
1Métodos y Comportamiento
Intro a Bloques de ImplementaciónEl Parámetro SelfMétodos MutablesFunciones AsociadasMúltiples Bloques de ImplementaciónEncadenamiento de MétodosResumen - Acciones de Rectángulo4Proyecto: Mascota virtual
Definir la mascotaAlimentar a la mascota7Traits estándar
El trait DebugEl trait DisplayClone y CopyTraits de igualdadResumen - Punto imprimible10Proyecto: Sistema de documentos
El Trait DrawComponente de texto2Encapsulamiento y módulos
Conceptos básicos de módulosLa palabra clave PublicCampos privadosGettersSettersRepaso - Casillero seguro5Genéricos
Estructuras genéricasMétodos genéricosMúltiples tipos genéricosFunciones genéricasResumen - Punto de coordenadas8Traits como límites
Sintaxis de límites de traitsLímites múltiplesLa cláusula whereRetornar tipos con traitsResumen: Impresora genérica11Patrones de diseño en Rust
Patrón NewtypeComposiciónEl Trait DropFrom e IntoResumen - Mock de Smart Pointer3Enums avanzados
Enums con datosMétodos en EnumsCoincidencia de variantes de datosEl Enum Option revisitadoResumen - Enum Shape6Definición de Traits
¿Qué es un Trait?Implementación de TraitsImplementaciones por defectoSobrescribir valores por defectoTraits con parámetrosResumen - Reproductor multimediaPractica por tu cuenta: Compilador de Rust online