Scala中反射的奇怪行为

时间:2012-07-01 15:20:25

标签: scala reflection scala-2.10

我试图跟随另一个问题的例子,我遇到了一些我无法解释的事情:

scala> import scala.reflect.runtime.{currentMirror => m}
import scala.reflect.runtime.{currentMirror=>m}

scala> m.mkToolBox()
<console>:12: error: value mkToolBox is not a member of reflect.runtime.universe.Mirror
              m.mkToolBox()
                ^

scala> import scala.tools.reflect.ToolBox
import scala.tools.reflect.ToolBox

scala> m.mkToolBox()
res3: scala.tools.reflect.ToolBox[reflect.runtime.universe.type] = scala.tools.reflect.ToolBoxFactory$ToolBoxImpl@225765b0

在导入mkToolBox之前,m如何不是ToolBox的成员,但之后呢?

2 个答案:

答案 0 :(得分:3)

ToolBox是一个隐含的类,它将mkToolBox移到Mirror上。与Eval相同的故事,皮条客eval

答案 1 :(得分:2)

如果我用reify检查它,我会看到:

scala> reify{ m.mkToolBox() }.tree
res4: reflect.runtime.universe.Tree = 
{
  val qual$1 = scala.tools.reflect.`package`.ToolBox(scala.reflect.runtime.`package`.m);
  val x$1 = qual$1.mkToolBox$default$1;
  val x$2 = qual$1.mkToolBox$default$2;
  qual$1.mkToolBox(x$1, x$2)
}

这意味着在包对象ToolBox中有一个名为scala.tools.reflect的函数的方法调用。它不是一个对象,因为reify会公开apply方法。

所以,即使API Docs for the Compiler在左侧没有显示任何东西,但如果查看包,你会看到隐含的方法定义。

PS:是的,这是一个真正的问题。我想到了一个具有相同名称特征的大写起始方法的想法,直到我想到为了获得树而重新启动这个东西。