【发布时间】:2013-02-04 21:04:31
【问题描述】:
当反射仍处于初期阶段时,在 Scala 2.10.0 里程碑的日子里,我 asked a question 关于如何使用它来查看来自 REPL 的代码树 sn-ps。出色的答案比我问的更进一步,并展示了如何使用它们来解析和评估树,所以我继续尝试在我今天正在进行的一个小项目中使用它。
不幸的是,以这种方式解析和评估的代码似乎没有看到任何 REPL 定义:
scala> val x = 1
x: Int = 1
scala> import scala.tools.reflect.ToolBox
import scala.tools.reflect.ToolBox
scala> val tb = scala.reflect.runtime.universe.runtimeMirror(
getClass.getClassLoader).mkToolBox()
tb: scala.tools.reflect.ToolBox[reflect.runtime.universe.type] = ...
scala> tb.eval(tb.parse("x"))
scala.tools.reflect.ToolBoxError: reflective compilation has failed:
not found: value x
有没有办法让它识别 REPL 上的定义?
【问题讨论】:
-
相对于不在REPL中?我在一个 sbt 项目中编写了完全相同的代码 (gist.github.com/jedesah/5812481),并且得到了与 REPL 中相同的行为。如果这是 ToolBox 在其他情况下的工作方式,我很想知道。
-
@UndercoverAgent 工具箱中的代码可以访问您可以从“root”访问的任何内容——否则它将毫无用处。在您展示的情况下,该变量在“根”中不可用。
-
无用这个词有点强,它可以用来评估自包含的树。无论如何,您正在/正在从事的这个小项目是开源的吗?我很想看到一个访问外部(从树本身)定义的示例,我不确定从“根”访问它们的确切含义。
-
好吧,没关系,我明白了! :-)
-
这不是一个真正的项目。我尝试编写一个用于 REPL 的两行单元测试套件,除了这里的这个小细节之外,它本来可以工作的。
标签: scala reflection scala-2.10