【问题标题】:Strange behavior with reflection in ScalaScala中反射的奇怪行为
【发布时间】:2012-07-01 15:20:25
【问题描述】:

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

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在导入ToolBox之前不是m的成员,但是之后呢?

【问题讨论】:

    标签: scala reflection scala-2.10


    【解决方案1】:

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

    【讨论】:

    • 隐式类?这当然解释了非常规命名的方法。
    【解决方案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)
    }
    

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

    因此,即使 API Docs for the Compiler 除了左侧的 trait 之外没有显示任何内容,但如果您查看包,您会看到一个隐式方法定义。

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

    【讨论】:

    • 在这种情况下我会做什么:我会查看来源以了解那里发生了什么。 ;)
    • @Antoras 很久没有一些 Scala 代码让我对它的含义感到困惑。解释很明显,但是我真的没想到ToolBox 是一种方法。
    猜你喜欢
    • 2023-03-31
    • 2011-05-09
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多