scala的诊断方法(2) 在repl下用reify查看表达式的翻译结果

之前介绍的-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)

Leave a Reply

Your email address will not be published. Required fields are marked *