100日後にRustをちょっと知ってる人になる: [Day 13]FizzBuzz
Day 13 のテーマ
今日は FizzBuzz を作ってみようと思います。
プログラム言語を学ばれる方って、まず最初に Hello Wolrd
から入って、少し言語仕様を学んで、そしてお試しに FizzBuzz を作ってみるという方って多いですよね。そんな基本に忠実にぼくも今日は FizzBuzz を少し考えてみようと思います。
FizzBuzz
まず、FizzBuzzについてです。
先にもふれたように、プログラム言語の基礎力確認のための問題です。以下のような内容のものを実装します。
-
1 から 100 までの各数値を新しい行に出力するプログラムを作成します。
-
3 の倍数ごとに、数字の代わりに
Fizz
と出力します。 -
5 の倍数ごとに、数字の代わりに
Buzz
と出力します。 -
3 と 5 の両方の倍数である数値については、数値の代わりに
FizzBuzz
を出力します。
基本的な 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) =>
:3
と5
ともに割り切れる場合、つまり剰余が0
の場合 -
(0, _) =>
:3
で割り切れ、5
で割り切れない場合 -
(0, _) =>
:3
で割り切れず、5
で割り切れる場合 -
_ =>
: 上記以外の場合
_
というシンボルは、特定のパターンは何にでもマッチしますが、変数には束縛されないというものです。指定されていないあらゆる値を無視したい時に使用します。
Day 13 のまとめ
FizzBuzz はよくそのプログラム言語がもつ仕様をいろいろと使って様々なものを作り出したりすることがあります。今日はシンプルに match
を使ったパターンマッチングにしてみましたが、Trait を使って分離してみたりなど、まだまだ他にも実装の仕方がありそうですよね。また別の機会に Rust の理解ぶりを確認するタイミングで FizzBuzz をしてみたいと思います。
Discussion