0

这就是我要的:

scala> var x:Int = 10
x: Int = 10

scala> var y:Int = 20
y: Int = 20

scala> val ret = q"return $x>$y"
ret: universe.Return = return 10.$greater(20)

scala> val result1 = toolbox.compile(ret)()
result1: Any = false

但问题是我将在字符串 var 中得到表达式 $x>$y,比如

scala> m
res20: String = $x>$y

然后我想执行操作,

var ret = q"return $m"

但是这个回报:

scala> var ret = q"return $m"
ret: universe.Return = return "$x>$y"

这不符合目的。如何在最后一步中获取 x 和 y 的值,而不是$x 和 $y。

4

1 回答 1

0

您可以混合 quasiquotes 并ToolBox.parse获得与您正在寻找的结果相似的结果:

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

val toolbox = scala.reflect.runtime.currentMirror.mkToolBox()

val s = "10>20"
val ret = q"return ${toolbox.parse(s)}"
// reflect.runtime.universe.Return = return 10.$greater(20)
toolbox.eval(ret)
// Any = false

将您的值用作变量:

import scala.tools.reflect.ToolBox
import scala.reflect.runtime.universe._
val toolbox = scala.reflect.runtime.currentMirror.mkToolBox()
val x = 10
val y = 20
val m = "x>y"
val ret = q"return ${toolbox.parse(m)}"
// reflect.runtime.universe.Return = return x.$greater(y)

如果您进行评估q"return ${toolbox.parse(m)}",您将看到错误,因为x并且y不在范围内。

scala> toolbox.eval(q"return ${toolbox.parse(m)}")
scala.tools.reflect.ToolBoxError: reflective compilation has failed:

object > is not a member of package x ...

要解决这个问题:

import scala.tools.reflect.ToolBox
import scala.reflect.runtime.universe._
val toolbox = scala.reflect.runtime.currentMirror.mkToolBox()
val q1 = q"val x = 10; val y = 20; "
val m = "x>y"
val ret = q"""
     |   ..$q1
     |   return ${toolbox.parse(m)}
     | """
toolbox.eval(ret)
// Any = false
于 2017-09-15T17:31:59.797 回答