Scalaではfor文に条件を書いてfilterかけれる。
Snippet: Primes | The Scala Programming Language
Primeってのは素数のことね。まだ学術的段階だから?複素数とか素数とか数学のサンプルとか多いね。
package sample.snippet object Primes extends Application { def isPrime(n: Int) = { (2 until n) forall (n % _ != 0) } for(i <- 1 to 100 if isPrime(i)) printf("%d,", i) }
先にisPrimeメソッドを解説。
2 until n で2からnまで(nは含まない)。nが9なら2,3,4,5,6,7,8ってこと。
さらにtoも出てくるけど、こういう記述はRangeオブジェクトとして扱われるらしい。
Rangeのスーパークラス(trait)にIterableがあって、そこにfotallメソッドが定義されてる。
forall(p : (A) => Boolean) : Boolean
Apply a predicate p to all elements of this iterable object and return true, iff the predicate yields true for all elements.
すべての要素が関数を満たしていればtrueを返し、1つでも関数を満たさなければfalseを返すメソッド。
ここでは、ある数nを2からn - 1までの数すべてで除算しても割り切れないことを確かめてる。
# 素数は1と自分自身以外割り切れない数だからね。
「_」はレシーバの省略記述。2からn - 1までの数が毎回代入される。
で、for文。1 to 100は1から100まで(100を含む)。
その後if文で条件を指定してる。この受験に当てはまらない場合ループをスキップすることになる。
今回はif文だけど、パターンマッチングも書けるらしい。
実行結果。
1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,
1から100までの素数が出力される。