想实现如下执行字符串表达式的能力(类似python中的eval)
var data = "1+2"
prinln(eval(data))
>>> 3
方案1:
import scala.reflect.runtime.universe
import scala.tools.reflect.ToolBox
val tb = universe.runtimeMirror(getClass.getClassLoader).mkToolBox() tb.eval(tb.parse("""println("hello!")"""))
方案2:
import com.twitter.util.Eval
val eval = new Eval
eval.apply[你想要的类型](字符串表达式)
//例如
eval.apply[Int]("1+2")
方案3:
此法能实现一些简单的表达式,复杂的可能报错
优点:不用三方jar包
import javax.script.ScriptEngineManager
val engine = new ScriptEngineManager().getEngineByName("scala")
engine.eval(expr)
易错:
可能有人会想利用字符串的能力,得到想要输出的字符串。
val result=s"${你想执行的字符串表达式}"
val age=20
val result=s"${age == 25}"//得到"false"
//实际长,当你传输字符串的时候
val result=s"${\"age == 25\"}"//得到的还是你的字符串本身
参考:
https://www.includehelp.com/code-examples/scala-using-string-interpolation-to-evaluate-expressions.aspx
https://stackoverflow.com/questions/39142979/dynamic-code-evaluation-in-scala
https://users.scala-lang.org/t/using-scala-as-a-java-scriptengine/4524