2017-09-13 10 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 

그러나 문제는 내가

scala> m 
res20: String = $x>$y 
같은 문자열 VAR의 표현 $ 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 결과를 달성하기 위해 무엇을 찾고 있습니다 : 당신 것 q"return ${toolbox.parse(m)}"을 평가하는 경우

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) 

: 변수로 값을 활용

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 

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