Scalaプログラミング2 条件分岐
Beginning Scala programming2
初心者ぺちぱーがGitHubでScalaレッスンを始めたぞ。ようやく2回目を書ける時間が取れた。前回はループについての問題を解いたので、今回は基本的な制御構造である条件分岐のif
式とmatch
式を覚えよう。
- Scalaスケーラブルプログラミング第2版
- 作者
- Martin Odersky
- Lex Spoon
- Bill Venners
- 出版社
- インプレスジャパン
- 発売日
- 2011-09-27
- メディア
- 単行本(ソフトカバー)
- 価格
- ¥ 4,968
Lessen2: if, else if, else
前回に引き続き、練習問題はここのページだ。FizzBuzzってよく噂に聞くよね。
なんか偉い人が考えた問題
ルールは以下の通り
1から順番に数を表示する
その数が3で割り切れるなら"Fizz"、5で割り切れるなら"Buzz"、両方で割り切れるなら"FizzBuzz"と表示する
要するに"1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz ・・・"と出力される
プログラマかどうかがわかるんだとさ
簡単に思いつくやり方は、if
式で条件分岐させる方法だ。Scalaの条件分岐は他の言語と同じく、if
とelse
、それからelse if
だ。あ、コップ本の"第07章 組み込みの制御構造"を開いて欲しい。
if
の条件式はtrue
かどうかに基づいて、分岐処理のどちらかを実行する。なので、最初は3でも5でも割り切れるかどうか、つまり15で割り切れるかどうかを判断する。次は3で割り切れるかどうか、その次は5で割り切れるかどうか。どの場合にも当てはまらない数字であれば、その数字をそのまま返せばいい。
後は、この関数に渡す数字を作ってみよう。
なんか出てきたんじゃないか!?
もうちょっといじってみよう。
出力部分の"Fizz"と"Buzz"は15で割り切れる場合に、どちらも出力されるわけだから、if
を一つ減らせそうだ。文字列を連結させてみよう。
これも同じ結果になったんじゃないか!?
でも、ちょっとScalaっぽくないね。val
じゃなくてvar
だし。ググってみると、こんなやり方があるらしい。これは思いつかないわー。
説明はリンク先のブログに書いてあるので、省略。
Pattern matching
他の言語にあるswitch
文は、Scalaではmatch
式で表現するようになっている。コップ本 p.140には、こう説明が書いてある。
Scalaのmatch式を使えば、他の言語のswitch文と同じように、いくつかの選択肢から1つを選ぶといった処理を記述できる。一般に、match式では任意のパターンを使って選択肢を指定できる。
上のfizzBuzz3
を参考に、このmatch
式を使って条件分岐だけの関数を作ってみよう。
case
の中にあるif
はパターンガードと言うそうだ。ここでは、引数i
に対して、それぞれ15、3、5で割り切れる場合、というパターンが上の3パターン。最後のパターンはどれにも当てはまらなかった場合のデフォルトの条件だ。switch
文のdefault:
みたいなやつよね。きっと。
これでScalaっぽくできたんじゃないか!?やったね!Scalaで条件分岐覚えたよ!
Conclusion
今回のレッスンもGitHubに上げてある。
次回はもう一度レッスン1に戻って、例外処理のtry
-catch
を覚えてみようと思う。