之前介绍的-Xprint:typer
或 -Xprint:jvm
方式,用于编译或执行脚本时。
当在repl下也想要查看类似效果时,可以用 universe.reify
方法
scala> import reflect.runtime.universe._
scala> reify( for(i <- 1 to 10) println(i) )
res0: reflect.runtime.universe.Expr[Unit] = Expr[Unit](scala.this.Predef.intWrapper(1).to(10).foreach(((i) => scala.this.Predef.println(i))))
scala> show(res0)
res9: String = Expr[Unit](scala.this.Predef.intWrapper(1).to(10).foreach(((i) => scala.this.Predef.println(i))))
scala> show(res0.tree)
res10: String = scala.this.Predef.intWrapper(1).to(10).foreach(((i) => scala.this.Predef.println(i)))
universe这个对象定义在 scala.reflect
包下的 runtime 包对象(package object)中:
是个 lazy val,类型是 JavaUniverse
,继承了scala.reflect.Universe
抽象类里的 reify 方法。
reify方法用于对一段表达式参数生成语法树。
这对定位隐式转换有帮助,比如我们不确定一个类型在哪儿被隐式转换了:
scala> 1.min(3) //min在哪儿定义的?
res0: Int = 1
scala> reify(1.min(3)).tree
res7: reflect.runtime.universe.Tree = Predef.intWrapper(1).min(3)