暗黙の型変換(implicit conversion)
case classと組み合わせて使うと効果的な機能の1つに、「暗黙の型変換」(implicit conversion)というものがあります。
例として、時間、日、年を「分」に変換するMinuteClsというcase classを取り上げてみましょう。
scala> case class MinuteCls(val num : Int) {
| def hours = num * 60
| def days = num * 60 * 24
| def years = num * 60 * 24 * 365
| def say = "この値は、 おおよそ"+ num +"分となります"
| }
defined class MinuteCls
MinuteClsのオブジェクトを生成し、メソッドを実行してみましょう。
scala> val m = MinuteCls(4) m: MinuteCls = MinuteCls(4) scala> m.hours res68: Int = 240 scala> m.days res69: Int = 5760
確かに、4時間は240分であり、4日間は5760分なので、この挙動は正しいです。しかし、このクラス定義自体がよくない(分かりにくい)のではと、思う人も多いでしょう。実は、このクラスは暗黙の型変換を介して用いることで、初めて分かりやすく使えるようになるものなのです。
Scalaでは、implicitキーワードをつけた関数定義によって暗黙の型変換が行えます。
scala> implicit def int2Minute( num:Int) = MinuteCls(num) int2Minute: (Int)MinuteCls
これにより、整数があたかも、hours、daysといったメソッドを持つように振舞うようになります。
scala> 2.hours res70: Int = 120
メソッドをチェーンさせることもできます。
scala> 3.days.say res71: java.lang.String = この値は、 おおよそ4320分となります scala> 10.years.say res133: java.lang.String = この値は、 おおよそ5256000分となります
暗黙の型変換とは、自身に対応する型を持たない場合の振る舞いを拡張する手法です。ここでは、整数(Int)である2,3,10という数値が、MinuteCls内に定義されているhours、days、years、sayというメソッドを自身を引数として呼び出しています。
この例は、あまりぱっとしないものでしたが、Scalaでは、Javaのメソッドを便利に拡張するための基本的なテクニックとして暗黙の型変換が数多く用いられています。これは、特にドメイン固有言語(DSL)を作る際に便利なテクニックです。
