🦀

100日後にRustをちょっと知ってる人になる: [Day 13]FizzBuzz

2022/09/04に公開

Day 13 のテーマ

今日は FizzBuzz を作ってみようと思います。
プログラム言語を学ばれる方って、まず最初に Hello Wolrd から入って、少し言語仕様を学んで、そしてお試しに FizzBuzz を作ってみるという方って多いですよね。そんな基本に忠実にぼくも今日は FizzBuzz を少し考えてみようと思います。

FizzBuzz

まず、FizzBuzzについてです。
先にもふれたように、プログラム言語の基礎力確認のための問題です。以下のような内容のものを実装します。

  • 1 から 100 までの各数値を新しい行に出力するプログラムを作成します。

  • 3 の倍数ごとに、数字の代わりに Fizz と出力します。

  • 5 の倍数ごとに、数字の代わりに Buzz と出力します。

  • 3 と 5 の両方の倍数である数値については、数値の代わりに FizzBu​​zz を出力します。

基本的な FizzBuzz

for ループと if-else ステートメントを使って以下のように記載してみました。

for x in 1..=100 {
    if x % 3 == 0 && x % 5 == 0 {
        println!("FizzBuzz")
    } else if x % 3 == 0 {
        println!("Fizz")
    } else if x % 5 == 0 {
        println!("Buzz")
    } else {
        println!("{}", x)
    }
}

1..=100 という記述以外は、Rust 固有の記述は特にありません。..= は「〜を含む」という範囲の指定の仕方です。

match オペーレータを用いた FizzBuzz

Rust には match という制御フロー演算子があります。

これは、値を一連のパターンと比較して、一致するパターンに基づいてコードを実行することができるオペレータです。
パターンは以下のようなもので構成できます:

  • リテラル値
  • 変数名
  • ワイルドカード
  • その他いろいろ

それでは、match を用いたパターンマッチングで以下のように書き直してみます。

for x in 1..=100 {
    match (x % 3, x % 5) {
        (0, 0) => println!("FizzBuzz"),
        (0, _) => println!("Fizz"),
        (_, 0) => println!("Buzz"),
        _ => println!("{}", x),
    }
}

少し説明をします。

  • match (x % 3, x % 5): マッチングする条件として x を 3 で割った際の剰余x を 5 で割った際の剰余を設定
  • (0, 0) =>: 35ともに割り切れる場合、つまり剰余が 0 の場合
  • (0, _) =>: 3で割り切れ、5で割り切れない場合
  • (0, _) =>: 3で割り切れず、5で割り切れる場合
  • _ =>: 上記以外の場合

_というシンボルは、特定のパターンは何にでもマッチしますが、変数には束縛されないというものです。指定されていないあらゆる値を無視したい時に使用します。

Day 13 のまとめ

FizzBuzz はよくそのプログラム言語がもつ仕様をいろいろと使って様々なものを作り出したりすることがあります。今日はシンプルに match を使ったパターンマッチングにしてみましたが、Trait を使って分離してみたりなど、まだまだ他にも実装の仕方がありそうですよね。また別の機会に Rust の理解ぶりを確認するタイミングで FizzBuzz をしてみたいと思います。

GitHubで編集を提案

Discussion