まとめ - 動物園マネージャー
CoddyのRustジャーニー「Object Oriented Programming」セクションの一部 — レッスン 48/61。
チャレンジ
簡単これまでに学んだトレイトオブジェクトの概念をすべて組み合わせた、動物園マネージャーを作成しましょう!異なる鳴き声を持つ様々な動物を1つのコレクションに保存し、順番に鳴かせるシステムを構築します。
コードは2つのファイルに分けて構成します:
animals.rs:&selfを受け取りStringを返すspeakメソッドを持つ、パブリックなSpeakトレイトを定義します。次に、それぞれパブリックなnameフィールド(String)を持つ3つのパブリックな構造体 —Dog、Cat、Bird— を作成します。それぞれの動物に対して、その特徴的な鳴き声でSpeakトレイトを実装してください:- Dog は
{name} says: Woof!を返す必要があります。 - Cat は
{name} says: Meow!を返す必要があります。 - Bird は
{name} says: Tweet!を返す必要があります。
- Dog は
main.rs: animals モジュールを取り込み、動物園を作成します!提供された入力を使用して、各動物タイプを1つずつ含むVec<Box<dyn Speak>>を構築します。Dog、Cat、Bird の順に追加してください。最後に、動物園を反復処理し、各動物の鳴き声をそれぞれの行に表示します。
このチャレンジは、トレイトオブジェクトの真の力を示しています。3つの完全に異なる動物タイプが1つのコレクションに共存し、それぞれが同じ 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 を反復処理し、各動物の鳴き声を出力する
}