Menu
Coddy logo textTech

まとめ - 動物園マネージャー

CoddyのRustジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 48/61。

challenge icon

チャレンジ

簡単

これまでに学んだすべてのトレイトオブジェクトの概念を組み合わせて、動物園マネージャーを作りましょう!それぞれ独自の鳴き声を持つさまざまな動物を1つのコレクションに格納し、1匹ずつ鳴かせるシステムを作成します。

コードは2つのファイルに分けて整理します。

  • animals.rs: &selfを受け取り、Stringを返すspeakメソッドを持つpublicなSpeakトレイトを定義します。次に、DogCatBirdという3つのpublicな構造体を作成し、それぞれにpublicなnameフィールド(String)を持たせます。それぞれの動物にSpeakトレイトを実装し、特徴的な鳴き声を返すようにします。
    • Dogは{name} says: Woof!を返す必要があります
    • Catは{name} says: Meow!を返す必要があります
    • Birdは{name} says: Tweet!を返す必要があります
  • 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!

たとえば、入力がRexWhiskersTweetyの場合:

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: Vec<Box<dyn Speak>> 型の zoo を作成する
    // 動物を順番に追加する: 最初に Dog、次に Cat、そして Bird

    // TODO: zoo を反復処理して各動物の鳴き声を出力する
}

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Rustオンラインコンパイラ