Menu
Coddy logo textTech

Повторение — Менеджер зоопарка

Часть раздела Object Oriented Programming путешествия по Rust на Coddy. Урок 48 из 61.

challenge icon

Задание

Легко

Давайте создадим менеджер зоопарка, который объединит все изученные вами концепции объектов типажа (trait objects)! Вы создадите систему, в которой различные животные — каждое со своим уникальным звуком — могут храниться в одной коллекции и подавать голос по очереди.

Вы организуете свой код в двух файлах:

  • animals.rs: Определите публичный типаж Speak с методом speak, который принимает &self и возвращает String. Затем создайте три публичные структуры — Dog, Cat и Bird — каждая с публичным полем name (String). Реализуйте типаж Speak для каждого животного с их характерными звуками:
    • Dog должен возвращать "{name} says: Woof!"
    • Cat должен возвращать "{name} says: Meow!"
    • Bird должен возвращать "{name} says: Tweet!"
  • main.rs: Подключите модуль animals и создайте зоопарк! Создайте Vec<Box<dyn Speak>>, содержащий по одному животному каждого типа, используя предоставленные входные данные. Добавьте их по порядку: сначала Dog, затем Cat, затем Bird. Наконец, переберите ваш зоопарк и выведите звук каждого животного на отдельной строке.

Эта задача демонстрирует реальную мощь объектов типажа — три совершенно разных типа животных живут вместе в одной коллекции, и каждое из них отвечает на один и тот же вызов speak() своим уникальным поведением.

Ваш вывод должен отображать голос каждого животного по порядку:

{dog_name} says: Woof!
{cat_name} says: Meow!
{bird_name} says: Tweet!

Например, при входных данных Rex, Whiskers и Tweety:

Rex says: Woof!
Whiskers says: Meow!
Tweety says: Tweet!

Вы получите три входных значения: имя собаки, имя кошки и имя птицы.

Попробуйте сами

mod animals;

use animals::{Speak, Dog, Cat, Bird};

fn main() {
    // Чтение входных данных для имен животных
    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: Создайте Vec<Box<dyn Speak>> с именем zoo
    // Добавьте животных по порядку: сначала Dog, затем Cat, затем Bird

    // TODO: Пройдите циклом по zoo и выведите звук каждого животного
}

Все уроки раздела Object Oriented Programming

Потренируйтесь самостоятельно: Онлайн-компилятор Rust