Catálogo de biblioteca
Parte de la sección Object Oriented Programming del Journey de Rust de Coddy — lección 60 de 61.
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 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 structs que implementen tu trait. UnBooktiene untitleyauthor(ambos Strings), mientras que unMagazinetiene unname(String) y un número deissue(u32). Cada struct debe implementarCatalogItemcon 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étododescriptionen 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 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 (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
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 multimedia