使用Scala Quasiquotes生成一个继承自已知类

时间:2015-11-30 23:07:46

标签: scala scala-quasiquotes

这在代码中更容易解释。我想做点什么:

import scala.reflect.runtime.currentMirror
import scala.tools.reflect.ToolBox
val toolbox = currentMirror.mkToolBox()

val universe: scala.reflect.runtime.universe.type = scala.reflect.runtime.universe
import universe._

class A { def a = "hello A" }

val c = toolbox.compile(q"""class C(x: Int) extends A { def r = x }""")

请注意动态生成的类C如何从已知/已编译的类A继承。

  1. 有没有办法使用了解A的工具箱?
  2. 如何使用动态生成的类?

1 个答案:

答案 0 :(得分:2)

这是一个例子。 "粘贴" class由REPL的类加载器加载,因此您可以显式提供它。您也可以使用tb.eval

$ scala
Welcome to Scala version 2.11.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_60).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import reflect.runtime._,universe._,tools.reflect.ToolBox
import reflect.runtime._
import universe._
import tools.reflect.ToolBox

scala> :pa -raw
// Entering paste mode (ctrl-D to finish)

package p { class Parent(val i: Int) }

// Exiting paste mode, now interpreting.


scala> val tb = runtimeMirror($intp.classLoader).mkToolBox()
tb: scala.tools.reflect.ToolBox[reflect.runtime.universe.type] = scala.tools.reflect.ToolBoxFactory$ToolBoxImpl@5e316c74

scala> tb.compile(tb.parse("""case class Child(j: Int) extends p.Parent(42) ; val c = Child(17) ; c.j"""))()
res0: Any = 17

scala> val tb = currentMirror.mkToolBox()
tb: scala.tools.reflect.ToolBox[reflect.runtime.universe.type] = scala.tools.reflect.ToolBoxFactory$ToolBoxImpl@59a67c3a

scala> tb.compile(tb.parse("""case class Child(j: Int) extends p.Parent(42) ; val c = Child(17) ; c.j"""))()
res1: Any = 17

在某个地方或本网站上的文档中肯定有一个例子。