戦略 Scala 日記

素人プログラマの思考のセンス

Doubleにべき乗演算子をつくるには?finalクラスを拡張する方法

Scalaの暗黙の型変換については、以前にも扱った。

形式知にして使う、暗黙のimplicit - 戦略 Scala 日記

今回は、implicit classを使って、クラスを拡張する方法を考える。 また継承が禁止されているJavaのfinalクラスを拡張して、オリジナルなメソッドをつくる例を紹介する。

scalaDoubleでは階上計算(^)のメソッドが用意されていない。 そこで、^を独自に定義してみる。

次のように、implicit classでクラスを定義し、引数に拡張したいクラスをとることで、これは暗黙のクラスとして、暗黙の型変換同様にクラスを変換する。

implicit class HatDouble(d: Double)

ここで、階上計算をするためのメソッド^を定義する。 すると、0.3^3のように自然な計算ができるようになる。

implicit class HatDouble(d: Double)  {
  def ^(idx: Int) = List.fill(idx)(d).fold(1.0)((d1, d2) => d1 * d2)
}

println(0.3^3) // => 0.027