0 until 100 (exclusive), 0 to 100 (inclusive) とはいったい何か? scala.Intの定義を見ても、until, toの関数定義は見当たらない。実際には、
0 until 100
-> 0.until(100) // Scalaでは関数適用時の.と括弧が省略できる
-> RichInt(0).until(100) // 0:Int -> RichInt(0) への変換
の流れでIntからRichIntへの変換が行われ、Range(0, 100)が生成されている。
Scalaではすべてのコードに対してscala.Predefに定義されている関数がincludeされている。ドキュメントをたどっていくと以下の定義が見つかる。
implicit def intWrapper(x:scala.Int) : scala.runtime.RichInt
これはimplicit converstionと呼ばれる。Scalaコンパイラは賢く、Intにuntilというメソッドの定義がない場合、Intに対してimplicit conversionを適用すれば、until関数が使えるかどうかまでをチェックしてくれる。変換して関数が使える場合、implicit conversionが適用され、プログラマが明示的に変換コードを書く手間が軽減される。つまり、
RichInt(0).until(100)
と書かなくても良い。