Menu
CoddyTech

回顾:动物园管理员

本课属于 Coddy Rust 学习旅程的“面向对象编程”单元。第 48 课,共 61 课。

challenge icon

挑战

简单

我们来构建一个动物园管理器,把你学过的所有 trait 对象概念结合起来!你将创建一个系统,让不同的动物各自发出独特的声音,并且可以存放在同一个集合中,依次发声。

你会把代码分到两个文件中:

  • animals.rs:定义一个公开的 Speak trait,其中包含一个 speak 方法,该方法接收 &self 并返回一个 String。然后创建三个公开的结构体:Dog、Cat 和 Bird,每个结构体都有一个公开的 name 字段(String)。为每种动物实现 Speak trait,并让它们发出各自特有的声音:
    • Dog 应返回 {name} says: Woof!
    • Cat 应返回 {name} says: Meow!
    • Bird 应返回 {name} says: Tweet!
  • main.rs:引入 animals 模块,创建一个动物园!使用提供的输入,构建一个包含每种动物各一只的 Vec<Box<dyn Speak>>。按顺序添加它们:先添加 Dog,然后是 Cat,最后是 Bird。最后,遍历动物园,并将每只动物发出的声音单独打印在一行上。

这个挑战展示了 trait 对象的真正强大之处:三种完全不同的动物类型可以共同存放在一个集合中,并且都能响应同一个 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!

你会收到 3 个输入:狗的名字、猫的名字和鸟的名字。

亲手试试

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: 创建一个名为 zoo 的 Vec<Box<dyn Speak>>
    // 按顺序添加动物:先添加 Dog,再添加 Cat,最后添加 Bird

    // TODO: 遍历 zoo,打印每只动物的叫声
}

面向对象编程中的所有课

自己练习: Rust 在线编译器