Scala中反射的奇怪行为

Dan*_*ral 6 reflection scala 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
Run Code Online (Sandbox Code Playgroud)

怎么mkToolBox不是m导入之前的成员ToolBox,而是之后的成员?

Dan*_*ral 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)
}
Run Code Online (Sandbox Code Playgroud)

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

因此,即使编译器的 API 文档除了左侧的特征之外没有显示任何内容,如果您查看包,您将看到隐式方法定义。

PS:是的,这是一个真正的问题。我并没有想到以大写开头的方法与特征的名称相同,直到我想到具体化这个东西来获取树。