Resumen: Impresora genérica
Parte de la sección Programación Orientada a Objetos del Journey de Rust de Coddy. Lección 44 de 61.
Desafío
Fácil¡Construyamos un sistema flexible de anuncios que demuestre el poder de los límites de rasgos! Crearás un rasgo Printable y una función genérica que pueda anunciar cualquier tipo que implemente este rasgo, mostrando cómo los genéricos y los rasgos 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 rasgo públicoPrintablecon un métodoprint_infoque toma&selfy devuelve unString. Después, 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()sobre el elemento.main.rs: Crea dos estructuras públicas que implementenPrintable:Person: con un campo públiconame(String). Su métodoprint_infodebe devolverPerson: {name}Product: con campos públicosname(String) yprice(f64). Su métodoprint_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 una Persona, un Producto o cualquier tipo futuro. Solo requiere que el tipo pueda proporcionar información mediante print_info(). El límite del rasgo garantiza esto en tiempo de compilación.
Tu salida debe 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 name público (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() {
// Lee las 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 el Person
// TODO: Llama a announce con el Product
}
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