2017-09-13 31 views
0

这就是我想要的:斯卡拉quasiquotes字符串变量提升

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。

回答

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)}"你会请参阅错误,因为xy不在范围内。

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 
+0

感谢您的答复。我在这里还有一个问题。该行: – Pankaj