0 until 100の裏側

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)

と書かなくても良い。

comments powered by Disqus