[プログラミング] 暗黙の型変換とか暗黙の引数の確認
一体どの関数が呼ばれているのかわからないことに定評のあるscalaの自動型変換/暗黙の引数だが、コンパイル時に-Xprint:typerオプションを付与することで確認可能である。
implicit.scala
val a = Map("a" -> 1, "b" -> 2) a.map(_._2)
オプションをつけて実行
$ scala -Xprint:typer implicit.scala [[syntax trees at end of typer]]// Scala source: implicit.scala package <empty> { final object Main extends java.lang.Object with ScalaObject { def this(): object Main = { Main.super.this(); () }; def main(argv: Array[String]): Unit = { val args: Array[String] = argv; { final class $anon extends scala.AnyRef { def this(): anonymous class $anon = { $anon.super.this(); () }; private[this] val a: scala.collection.immutable.Map[java.lang.String,Int] = scala.this.Predef.Map.apply[java.lang.String, Int](scala.this.Predef.any2ArrowAssoc[java.lang.String]("a").->[Int](1), scala.this.Predef.any2ArrowAssoc[java.lang.String]("b").->[Int](2)); private <stable> <accessor> def a: scala.collection.immutable.Map[java.lang.String,Int] = $anon.this.a; $anon.this.a.map[Int, scala.collection.immutable.Iterable[Int]](((x$1: (java.lang.String, Int)) => x$1._2))(immutable.this.Iterable.canBuildFrom[Int]) }; { new $anon(); () } } } } }
これでmapメソッドの暗黙の引数にimmutable.this.Iterable.canBuildFrom[Int]が使われていることがわかる。