Scalaのimplicit defの不思議な挙動

  • 投稿日:
  • 更新日:2015/03/06
  • by
  • カテゴリ:

まだ理解が浅いせいか、Scalaでimplicit defを使っていて、ちょっと不思議な挙動に出くわしました。

次のようなコードを実行します。

object test extends Application {
  var count = 0
  implicit def declare(property: String) = {
    class A {
      def plus(a: Int):A = { count = count + a; this }
    }
    new A
  }
  "a" plus 1 plus 1 plus 1
  println(count)
}
  

"a"はimplicit defにかかり、Aを返します。 その後、そのオブジェクトに対してplus 1を3回実行しています。 というか、そのつもりです。

結果は、7と表示されます。

  "a" plus 1 plus 1 plus 1
  

の部分を以下のようにすると、

  var a = "a" plus 1
  a plus 1
  a plus 1
  

期待通り3が出力されます。

デバッガで追いかけても、確かに"plus 1"の回数をnとすると、関数plusが2^n-1回実行されているようです。

う~ん、不思議。


こちらもよく読まれています