scala - 如何让 Scala ToolBox 查看 REPL 定义?

标签 scala reflection scala-2.10

回到反射(reflection)还刚刚开始的时候,在 Scala 2.10.0 里程碑的日子里,我 asked a question关于如何使用它来查看来自 REPL 的代码片段树。出色的答案比我问的更进一步,并展示了如何使用它们来解析和评估树,所以我继续尝试在我今天正在进行的一个小项目中使用它。

不幸的是,以这种方式解析和评估的代码似乎没有看到任何 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,试图让它支持类型宏,所以我有能力解释为什么它不起作用。让它工作将是下一步:)

我知道您知道输入 repl 的每个片段在编译之前都会被包装到一些样板文件中。因此, x 最终成为具有奇怪名称的包中嵌套嵌套嵌套对象中的字段。

显然,repl 会跟踪所有定义的符号,然后将必要的导入连同它生成的样板一起注入(inject)。因此后续行可以看到 x 不合格。相比之下,工具箱只是重用 repl 的类加载器,但不对导入做任何事情,因此失败了。

一种解决方法是以某种方式获取表示 repl 的对象,询问它定义的符号,然后生成相应的导入到您提供给工具箱的代码中。如果您提交工单,我将尝试在 2.10.1 代码卡住疯狂结束后(假设是本周末)编写一个解决方法。

关于scala - 如何让 Scala ToolBox 查看 REPL 定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14695609/

相关文章:

c# - 使用反射在 C# 中查找字段的指针

c# - .NET 反射 - 如何从 ParameterInfo 中获取 "real"类型

Scala 编译器崩溃 : What's wrong here?

scala - Play Framework 从 Play 服务器向 "somesite.com"发出 http 请求并将响应发送回浏览器

scala - 为 Scala 创建 `**` 幂运算符?

Scala 编译器优化以实现不变性

scala - 函数式编程 - 非常强调递归,为什么?

模型类上反射 toString 中的 java.lang.ClassCastException : [Z cannot be cast to [Ljava. lang.String

scala - 如何让 spark udf 接受不同数据类型的列表?

Scala 多图 : get item or else empty set