トレイトオブジェクトを返す関数の作成

Boxでくくって、dyn キーワードをつけるのがミソ

trait Animal {
  fn cry(&self);
}

struct Dog {}

impl Animal for Dog {
  fn cry(&self) {
    println!("ワン");
  }
}

struct Cat {}

impl Animal for Cat {
  fn cry(&self) {
    println!("にゃん");
  }
}

fn new_animal(animal: &str) -> Box<dyn Animal> {
  if animal == "Dog" {
    Box::new(Dog{})
  } else {
    Box::new(Cat{})
  }
}

fn main() {
  let animal = new_animal("Dog");
  animal.cry();
}