6

我试图从另一个问题中举一个例子,但我遇到了一些我无法解释的事情:

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不是mimport前的成员ToolBox,而是之后的成员?

4

2 回答 2

3

ToolBox是一个隐式类,皮条客mkToolBoxMirror. 同样的故事Eval,皮条客eval

于 2012-07-01T22:01:10.563 回答
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 文档只显示左侧的特征,但如果您查看包,您会看到隐式方法定义。

PS:是的,这是一个真正的问题。直到我想到将事物具体化以获取树时,我才想到使用具有相同名称的特征的大写开头方法。

于 2012-07-01T15:20:26.910 回答