Scalaのfor式
とても高機能なのでいろんな使い道がある。
code:scala
# 基本構文
for (ジェネレータ) 本体の式
# ジェネレータは以下の形式
x <- 式
# ジェネレータは;区切り、または改行区切りで複数取れる
for (x <- 式; y <- 式; z <- 式) { ... }
数値のループに用いる例
code:scala
scala> for (x <- 1 to 5; y <- 1 until 5) println("x=" + x + " y=" + y)
x=1 y=1
x=1 y=2
x=1 y=3
x=1 y=4
x=2 y=1
x=2 y=2
x=2 y=3
x=2 y=4
x=3 y=1
x=3 y=2
x=3 y=3
x=3 y=4
x=4 y=1
x=4 y=2
x=4 y=3
x=4 y=4
x=5 y=1
x=5 y=2
x=5 y=3
x=5 y=4
1 to 5 で末尾の5を含むループ、1 until 5 で末尾の5を含まないループにしている。
ジェネレータの後置if
code:scala
scala> for (x <- 1 to 5; y <- 1 until 5 if x % y == 0) {
println("x=" + x + " y=" + y)
}
x=1 y=1
x=2 y=1
x=2 y=2
x=3 y=1
x=3 y=3
x=4 y=1
x=4 y=2
x=4 y=4
x=5 y=1
2つ目のジェネレータに後置ifをつけて本体式を回す条件を絞り込んでいる。
コレクションのループ
code:scala
scala> for (e <- List("A", "B", "C", "D", "E")) println(e)
A
B
C
D
E
yieldキーワードを使ったコレクションの加工
code:scala
scala> for (e <- List("A", "B", "C", "D", "E")) yield "Pre" + e
res6: ListString = List(PreA, PreB, PreC, PreD, PreE) yieldキーワードを使うとfor式が値を返すようになる。 これは for-comprehension = for内包表記 と呼ばれる。pythonに似た名前があったね。