Repaso - Gestor del zoológico
Parte de la sección Programación Orientada a Objetos del Journey de Rust de Coddy. Lección 48 de 61.
Desafío
Fácil¡Construyamos un gestor de zoológico que reúna todos los conceptos de objetos de rasgo que has aprendido! Crearás un sistema en el que diferentes animales, cada uno con su propio sonido único, puedan almacenarse en una sola colección y emitir su sonido uno por uno.
Organizarás tu código en dos archivos:
animals.rs: Define un rasgo públicoSpeakcon un métodospeakque reciba&selfy devuelva unString. Después, crea tres estructuras públicas,Dog,CatyBird, cada una con un campo públiconame(String). Implementa el rasgoSpeakpara cada animal con sus sonidos característicos:- Dog debería devolver
{name} says: Woof! - Cat debería devolver
{name} says: Meow! - Bird debería devolver
{name} says: Tweet!
- Dog debería devolver
main.rs: Incorpora tu módulo de animales y ¡crea un zoológico! Construye unVec<Box<dyn Speak>>que contenga uno de cada tipo de animal usando las entradas proporcionadas. Añádelos en este orden: primero Dog, después Cat y después Bird. Finalmente, itera por 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 que viven juntos en una sola colección y responden a la misma llamada speak(), cada uno con su propio comportamiento único.
Tu salida debería mostrar a cada animal emitiendo su sonido 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: Crea un Vec<Box<dyn Speak>> llamado zoo
// Añade los animales en orden: Dog primero, luego Cat, luego Bird
// TODO: Itera a través del zoo e imprime el sonido de cada animal
}
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 multimedia9Objetos de Trait
Despacho dinámicoVectores de TraitsIteración de objetos de TraitRepaso - Gestor del zoológicoPractica por tu cuenta: Compilador de Rust online