制御構文
if文
if(条件式){ブロック(1) } else{ ブロック(2) }
条件式は、Boolean(真偽値)で表わされる式です。条件式が「true(真)」の処理内容をブロック(1)に、「false(偽)」の処理内容をブロック(2)に記述します。JavaやC/C++と異なり、Scalaのif文は値を返します。これは、前述のように中括弧で区切られたブロックが値を返すためです。次で試してみましょう。
scala> val flag = true flag: Boolean = true scala> if (flag) 1 else -1 res2: Int = 1
ブロック(1)とブロック(2)の部分の戻り値が同一に揃えられている場合(ここではInt)、if文全体の戻り値もその型となります(ここではInt)。
scala> if (flag) 1 else "something" res3: Any = 1
ブロック(1)とブロック(2)の部分の戻り値が異なる場合、if文全体の戻り値はそれらの上位型となります(ここではAny)。また、if else式は次の構文のようにつなげることもできます(LIST8)。
if(条件式){
ブロック(1)
}else if(条件式){
ブロック(2)
}else{
ブロック(3)
}}
scala> val test = 1
test: Int = 1
scala> var ret = 0
ret: Int = 0
scala> ret = if(test == 1){
| 1 //Int型
| }else if(test == 2){
| 2 //Int型
| }else{
| 3 //Int型
| }
ret: Int = 1 //戻り値を受け取っている事を確認出来る
scala> val ret = if(test == 1){50} //ret = 50 となって欲しいのだが・・・
ret: Unit = () //実際にはUnit型となる
なお、elseのないif文は強制的に戻り値がUnit型となります。
while
Scalaのwhile文は、他の言語のwhileと同等と言って良いでしょう。ここでは省略しますが、dowhile文も使用できます。
while(条件式){
処理
}
for
Scalaのforは、Java SE 5の拡張forループのような表記がデフォルトです。
for(i <- 開始値 to 終了値) {ブロック}
for(i <- 開始値 to 終了値 ; 条件式1; 条件式2; ……)
見慣れないかもしれませんが、i=1, 2, 3...と連続的に増加していく点は同一です(LIST9)。
scala> for(i <- 1 to 3){ println(i) }
1
2
3
scala> for(i <- 1 to 5; if(i>1); if(i<3)){ println(i) }
2
yieldキーワードを用いたコレクションを返すループ
ここまでのforループは、制御構造を表わすJavaやC/C++などと同等のものですが、yieldキーワードを用いると、各ループごとの処理結果を返すことができます。図1のようにループの各要素を2倍していく単純な例を記述してみましょう(LIST10)。
scala> val test = for(i <- 1 to 3) yield{ i * 2}
test: RandomAccessSeq.Projection[Int] = RangeM(2, 4, 6)
ループ内のブロック{ i * 2}による処理結果の全体がyieldを介して、変数testに投影(projection)されています。変数testは、Int型の値を持ちます。testの各要素にはカッコ内0からはじまる順序を書いてアクセスできます(LIST11)。testはいわゆるコレクション(集合)となります。Scalaでのコレクションの扱いについては次ページで解説します。
scala> test(0) res1: Int = 2 scala> test(1) res3: Int = 4

