FizzやBuzzをオブジェクトにしろという要求と、
PopやJazzなど拡張に対応しろという要求があったので、
二つを満たしてオブジェクト指向で書けばいいんだよね?

// FizzやBuzzなどはこのMember型になり hello() で数値に反応して名前を応える
struct Member { number: usize, name: &'static str, }
impl Member {
fn new(number: usize, name: &'static str) -> Self {
Self { number, name, }
}
fn hello(&self, number: usize) -> Option<&'static str> {
(number % self.number == 0).then_some(self.name)
}
}

// 上述Memberたちのまとめ役がOrganizer型
struct Organizer { members: Vec<Member>, }
impl Organizer {
fn new(info: &[(usize, &'static str)]) -> Self {
Self { members: info.iter().map(|&(number, name)| Member::new(number, name)).collect(), }
}
fn number_to_string(&self, number: usize) -> String {
let hellos = self.members.iter().map(|member| member.hello(number)).collect::<Vec<_>>();
format!("{}", NumberToString { number, hellos: &hellos, })
}
}