Recapitulação - Gerenciador de Zoológico
Parte da seção Programação Orientada a Objetos do Journey de Rust da Coddy. Lição 48 de 61.
Desafio
FácilVamos criar um gerenciador de zoológico que reúne todos os conceitos de objetos de trait que você aprendeu! Você criará um sistema no qual diferentes animais, cada um com seu próprio som único, possam ser armazenados em uma única coleção e emitir seus sons um por um.
Você organizará seu código em dois arquivos:
animals.rs: Defina uma trait públicaSpeakcom um métodospeakque recebe&selfe retorna umaString. Em seguida, crie três structs públicas,Dog,CateBird, cada uma com um campo públiconame(String). Implemente a traitSpeakpara cada animal com seus sons característicos:- Dog deve retornar
{name} says: Woof! - Cat deve retornar
{name} says: Meow! - Bird deve retornar
{name} says: Tweet!
- Dog deve retornar
main.rs: Inclua seu módulo de animais e crie um zoológico! Construa umVec<Box<dyn Speak>>contendo um animal de cada tipo usando as entradas fornecidas. Adicione-os na ordem: primeiro Dog, depois Cat e então Bird. Por fim, percorra seu zoológico e imprima o som de cada animal em sua própria linha.
Este desafio demonstra o verdadeiro poder dos objetos de trait: três tipos de animais completamente diferentes vivendo juntos em uma única coleção, cada um respondendo à mesma chamada speak() com seu próprio comportamento único.
Sua saída deve exibir cada animal emitindo seu som na ordem:
{dog_name} says: Woof!
{cat_name} says: Meow!
{bird_name} says: Tweet!Por exemplo, com as entradas Rex, Whiskers e Tweety:
Rex says: Woof!
Whiskers says: Meow!
Tweety says: Tweet!Você receberá três entradas: o nome do cachorro, o nome do gato e o nome do pássaro.
Experimente você mesmo
mod animals;
use animals::{Speak, Dog, Cat, Bird};
fn main() {
// Leia a entrada para os nomes dos animais
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: Crie um Vec<Box<dyn Speak>> chamado zoo
// Adicione os animais na ordem: Dog primeiro, depois Cat, depois Bird
// TODO: Itere pelo zoo e imprima o som de cada animal
}
Todas as lições de Programação Orientada a Objetos
1Métodos e Comportamento
Introdução a Blocos de ImplementaçãoO Parâmetro SelfMétodos MutáveisFunções AssociadasMúltiplos Blocos de ImplementaçãoEncadeamento de MétodosRecapitulação - Ações de Retângulo4Projeto: Pet Virtual
Definindo o PetAlimentando o Pet7Traits Padrão
A Trait DebugA Trait DisplayClone e CopyTraits de IgualdadeRecapitulação - Ponto Imprimível10Projeto: Sistema de Documentos
A Trait DrawComponente de Texto2Encapsulamento e Módulos
Fundamentos de MódulosA Palavra-chave PublicCampos PrivadosGettersSettersRecapitulação - Cofre Seguro5Genéricos
Structs GenéricasMétodos GenéricosMúltiplos Tipos GenéricosFunções GenéricasRecapitulação - Ponto de Coordenada8Traits como Restrições
Sintaxe de Restrições de TraitRestrições MúltiplasA Cláusula WhereRetornando Tipos com TraitsRecapitulação - Impressora Genérica11Padrões de Projeto em Rust
Padrão NewtypeComposiçãoA Trait DropFrom e IntoRecapitulação - Mock de Smart Pointer3Enums Avançados
Enums com DadosMétodos em EnumsCorrespondência de Variantes de DadosO Enum Option RevisitadoRecapitulação - Enum Shape6Definição de Traits
O que é uma Trait?Implementando TraitsImplementações PadrãoSobrescrevendo PadrõesTraits com ParâmetrosRecapitulação - Media Player9Objetos Trait
Despacho DinâmicoVetores de TraitsIterando Objetos TraitRecapitulação - Gerenciador de ZoológicoPratique por conta própria: Compilador de Rust online