5

以下是我的 Scala 提示中的一些片段。我导入反射 API 并尝试具体化一些表达式,如此处的文档中所述。

scala> import scala.reflect.runtime.{universe => ru}
scala> val str = "Duck I says."

scala> ru.showRaw(ru.reify(println(2)))
res40: String = Expr(Apply(Select(Select(This(newTypeName("scala")), 
    newTermName("Predef")), newTermName("println")), List(Literal(Constant(2)))))

scala> ru.showRaw(ru.reify(str.length))    
res41: String = Expr(Apply(Select(Select(Select(Select(Select(Ident($line4), 
    newTermName("$read")), newTermName("$iw")), newTermName("$iw")), 
    newTermName("str")), newTermName("length")), List()))

我没想到会在第二个中看到这些符号$line4,$read和。$iw它们是什么,它们为什么在那里?

4

1 回答 1

5

val str ...在 REPL 中实际上不是语言环境变量,而是某个对象的属性。看到这个答案

包装变量定义并reify使用如下代码块调用:

{
  val str = ...
  showRaw{reify {...}}
}
于 2013-05-10T13:23:44.627 回答