Resumen: Impresora genérica
Parte de la sección Object Oriented Programming del Journey de Rust de Coddy — lección 44 de 61.
Desafío
Fácil¡Vamos a construir un sistema de anuncios flexible que demuestre el poder de los trait bounds! Crearás un trait Printable y una función genérica que pueda anunciar cualquier tipo que implemente este trait, mostrando cómo los genéricos y los traits 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 trait públicoPrintablecon un métodoprint_infoque tome&selfy devuelva unString. Luego, crea una función genérica pública llamadaannounceque acepte cualquier tipoTque implementePrintable. Esta función debe imprimirAnnouncement: {info}donde{info}es el resultado de llamar aprint_info()en el elemento.main.rs: Crea dos structs públicos que implementenPrintable:Person— con un campo públiconame(String). Suprint_infodebe devolverPerson: {name}Product— con campos públicosname(String) yprice(f64). Suprint_infodebe devolverProduct: {name} - ${price}
announcecon cada uno para demostrar que tu función genérica funciona con cualquier tipoPrintable.
La belleza de este diseño es que a announce no le importa si recibe un Person, un Product o cualquier tipo futuro; solo requiere que el tipo pueda proporcionar información a través de print_info(). El trait bound garantiza esto en tiempo de compilación.
Tu salida debería 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.99Recibirá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 público name (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() {
// Leer 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 la Person
// TODO: Llama a announce con el Product
}
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