Repaso - Gestor del zoológico
Parte de la sección Object Oriented Programming del Journey de Rust de Coddy — lección 48 de 61.
Desafío
Fácil¡Vamos a construir un gestor de zoológico que reúna todos los conceptos de objetos de rasgo (trait objects) que has aprendido! Crearás un sistema donde diferentes animales —cada uno con su propio sonido único— pueden almacenarse en una sola colección y hacerse hablar uno por uno.
Organizarás tu código en dos archivos:
animals.rs: Define un trait públicoSpeakcon un métodospeakque tome&selfy devuelva unString. Luego crea tres structs públicos —Dog,CatyBird— cada uno con un campo públiconame(String). Implementa el traitSpeakpara cada animal con sus sonidos característicos:- Dog debe devolver
"{name} says: Woof!" - Cat debe devolver
"{name} says: Meow!" - Bird debe devolver
"{name} says: Tweet!"
- Dog debe devolver
main.rs: ¡Importa tu módulo de animales y crea un zoológico! Construye unVec<Box<dyn Speak>>que contenga uno de cada tipo de animal utilizando las entradas proporcionadas. Añádelos en orden: primero Dog, luego Cat y después Bird. Finalmente, itera a través de tu zoológico e imprime el sonido de cada animal en su propia línea.
Este desafío demuestra el verdadero poder de los objetos de rasgo: tres tipos de animales completamente diferentes conviviendo en una sola colección, cada uno respondiendo a la misma llamada speak() con su propio comportamiento único.
Tu salida debe mostrar a cada animal hablando en orden:
{dog_name} says: Woof!
{cat_name} says: Meow!
{bird_name} says: Tweet!Por ejemplo, con las entradas Rex, Whiskers y Tweety:
Rex says: Woof!
Whiskers says: Meow!
Tweety says: Tweet!Recibirás tres entradas: el nombre del perro, el nombre del gato y el nombre del pájaro.
Pruébalo tú mismo
mod animals;
use animals::{Speak, Dog, Cat, Bird};
fn main() {
// Leer la entrada para los nombres de los animales
let mut dog_name = String::new();
std::io::stdin().read_line(&mut dog_name).expect("Failed to read line");
let dog_name = dog_name.trim().to_string();
let mut cat_name = String::new();
std::io::stdin().read_line(&mut cat_name).expect("Failed to read line");
let cat_name = cat_name.trim().to_string();
let mut bird_name = String::new();
std::io::stdin().read_line(&mut bird_name).expect("Failed to read line");
let bird_name = bird_name.trim().to_string();
// TODO: Crear un Vec<Box<dyn Speak>> llamado zoo
// Añadir los animales en orden: Dog primero, luego Cat, después Bird
// TODO: Iterar a través de zoo e imprimir el sonido de cada animal
}
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 multimedia9Objetos de Trait
Despacho dinámicoVectores de TraitsIteración de objetos de TraitRepaso - Gestor del zoológico