アットウィキロゴ

for式

for文ではなくfor式と呼びます。
リストの中にさらにリストを持っている変数を定義し、
for式でループさせて値を出力するプログラムを書いてみようと思います。

   val aaa = List("aaa", "bbb", "ccc")
   val bbb = List("aaa2", "bbb2", "ccc2", "ddd2", "eeee2")
   val ccc = List("aaa3", "bbb3", "ccc3", "ddd3")
   val list = List(aaa,bbb,ccc)

   for (
     str <- list                // listから子のリストを取り出し、strに格納する
     if (str.length < 5); // 要素が5未満のリストに絞るフィルター
     value <- str           // 子のリストからString値を順番に取得してvalueに格納
  ) println(str.length + " : " + value)

上記プログラムで、for式の括弧の中にif文が書いてありますが、
これを「フィルター」と呼びます。子リストの要素が5未満、つまり、この例ではbbbが処理対象からフィルタリングされて外れます。
javaだとfor文の本文にif 文を書き、不要な値のフィルタリングをします。
Scalaでも同様の記法が可能ですが、コップ本にはフィルターによる処理が紹介されています。

結果は以下になります
 3 : aaa
 3 : bbb
 3 : ccc
 4 : aaa3
 4 : bbb3
 4 : ccc3
 4 : ddd3

想定通り、List変数bbbの中身はフィルタリングされ、出力されませんでした。



●その他の記法1
添字で配列にアクセスしたいなどの場合、以下の記法が使えます。
for (i <- 1 to 5)       // 1から5まで
  println("i = " + i)

表示は以下になります。
i = 1
i = 2
i = 3
i = 4
i = 5

ちなみに1 to 5 ですが、コンソールから「1 to 5」と入力すると以下になります。
scala> 1 to 5
res1: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)

1 to 5を呼ぶことでRangeオブジェクトが生成されます。for文の構文のように考えず、
オブジェクトの新しい生成法と考えると良さそうです。
最終更新:2013年10月06日 10:19
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。