if式

今日から Scala の制御構文を見ていく。まずは if 式。

……の前に、ブロック式。ブロック式というのは、ドワンゴの研修資料で便宜的に使われている用語だけど、要するに、複数の式を { と } で囲ったものだ。Scala は中の式を順番に評価し、最後の式の値がブロック式の値となる。

scala> { println("A"); println("B"); 1 + 2; }
A
B
res0: Int = 3

見ての通り、A と B が順に出力され、最後の 1 + 2 を評価した結果がブロック式の値として返ってきている。Scala の式は ; で区切る代わりに改行で区切ってもいいので次のようにも書ける。

scala> {
| println("A")
| println("B")
| 1 + 2
| }
A
B
res1: Int = 3

さて、if 式だけど、いたって普通の構文だ。見たほうが早い。

scala> var age = 17
age: Int = 17

scala> if (age < 18) {
| "18歳未満です"
| } else {
| "18歳以上です"
| }
res2: String = 18歳未満です

scala> age = 18
age: Int = 18

scala> if (age < 18) {
| "18歳未満です"
| } else {
| "18歳以上です"
| }
res3: String = 18歳以上です

if に続くカッコの中の条件式は Boolean 型である必要がある。

if 式は式なので、それ自体が値を持つ。上の例でも「18歳未満です」とかの値が返ってきているのがわかる。ということは変数へ代入もできるってことだ。

scala> var a = if (age < 18) {
| "18歳未満です"
| } else {
| "18歳以上です"
| }
a: String = 18歳以上です

変数 a に代入された。

ところで、else 以降は省略が可能だ。その場合には Unit 型の値 () が補われたものとして評価される。……ってことは、条件式が真の場合と偽の場合で返ってくる方が違うことになるんだけどいいんだろうか。

scala> a = if (age < 18) {
| "18歳未満です"
| }
<console>:13: error: type mismatch;
found : Unit
required: String
a = if (age < 18) {
^

あ、やっぱりエラーになった。こういう時はどうするんだろう。