Menu
Coddy logo textTech

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

Часть раздела Объектно-ориентированное программирование путешествия по Rust на Coddy. Урок 48 из 61.

challenge icon

Задание

Легко

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

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

  • 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: Подключите модуль с животными и создайте зоопарк! Создайте 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 и вывести звук каждого животного
}

Все уроки раздела Объектно-ориентированное программирование

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