首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AST取消引用使用拟引号和从reify返回的树

AST取消引用使用拟引号和从reify返回的树
EN

Stack Overflow用户
提问于 2014-08-29 13:53:21
回答 1查看 517关注 0票数 1

我试图一起使用工具箱和准引用来执行代码生成任务,并在使用从StackOverflowError返回的对象的AST时面对reify(x).tree,我的代码如下:

代码语言:javascript
复制
abstract class A[T] {def i: T}
class B(val i: Int) extends A[Int]
object A {

    import scala.reflect.runtime.universe._
    import scala.reflect.runtime.{universe => ru}
    import scala.tools.reflect.ToolBox

    val javaSeparator = "$"
    val curId = new java.util.concurrent.atomic.AtomicInteger()

    protected def freshName(prefix: String): TermName = {
        newTermName(s"$prefix$javaSeparator${curId.getAndIncrement}")
 }

 def main(args: Array[String]) {
    val b = new B(2)
    calculate(b)
 }

 def calculate(a: A[_]): Unit = {

    val toolBox = runtimeMirror(getClass.getClassLoader).mkToolBox()
    val i = freshName("i")
    val aTree = reify(a).tree

    val tree = q"""
       val $i = $aTree.i
      println($i)
   """

   toolBox.eval(tree)
  }
}

当我删除A类的类型参数或使用def calculate(a: B)时,toolBox.eval成功并按预期工作,即在控制台中打印2。

我不太明白为什么会发生这种情况,有人能解释为什么带有类型参数的类定义会导致评估失败吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-02 07:06:44

我是https://issues.scala-lang.org/browse/SI-8833。在修复错误之前,您可以使用JIRA中的注释中概述的解决方案。我只为2.11.x提供了一个解决方案,如果您需要2.10.x的解决方案,请留下评论。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25569776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档