回顾:动物园管理员
本课属于 Coddy Rust 学习旅程的“面向对象编程”单元。第 48 课,共 61 课。
挑战
简单我们来构建一个动物园管理器,把你学过的所有 trait 对象概念结合起来!你将创建一个系统,让不同的动物各自发出独特的声音,并且可以存放在同一个集合中,依次发声。
你会把代码分到两个文件中:
animals.rs:定义一个公开的Speaktrait,其中包含一个speak方法,该方法接收&self并返回一个String。然后创建三个公开的结构体:Dog、Cat和Bird,每个结构体都有一个公开的name字段(String)。为每种动物实现Speaktrait,并让它们发出各自特有的声音:- Dog 应返回
{name} says: Woof! - Cat 应返回
{name} says: Meow! - Bird 应返回
{name} says: Tweet!
- Dog 应返回
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 在线编译器