我试图跟随另一个问题的例子,我遇到了一些我无法解释的事情:
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
的成员,但之后呢?
答案 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:是的,这是一个真正的问题。我想到了一个具有相同名称特征的大写起始方法的想法,直到我想到为了获得树而重新启动这个东西。