我在回答Generating a class from string and instantiating it in Scala 2.10时找到了Scala运行时脚本的示例代码,但是代码似乎已经过时了2.11 - 我找不到与build.setTypeSignature
对应的任何函数。即使它有效,代码似乎很难阅读并跟随我。
如何在Scala 2.11中编译和执行Scala脚本?
让我们假设我想要关注:
为简单起见,请考虑以下示例:
我想定义以下变量(以编程方式,从代码中,而不是从脚本文本中):
val a = 1
val s = "String"
我希望编译以下脚本,并在执行时从其返回String
值"a is 1, s is String"
:
s"a is $a, s is $s"
我的功能应该如何?
def setupVariables() = ???
def compile() = ???
def changeVariables() = ???
def execute() : String = ???
答案 0 :(得分:2)
Scala 2.11 adds a JSR-223 scripting engine。它应该为您提供您正在寻找的功能。提醒一下,与所有这些动态事物一样,包括上面描述中列出的示例,您将失去类型安全性。您可以在下面看到返回类型始终为Object。
Scala REPL示例:
scala> import javax.script.ScriptEngineManager
import javax.script.ScriptEngineManager
scala> val e = new ScriptEngineManager().getEngineByName("scala")
e: javax.script.ScriptEngine = scala.tools.nsc.interpreter.IMain@566776ad
scala> e.put("a", 1)
a: Object = 1
scala> e.put("s", "String")
s: Object = String
scala> e.eval("""s"a is $a, s is $s"""")
res6: Object = a is 1, s is String`
作为在scala 2.11.6下运行的应用程序的附加示例:
import javax.script.ScriptEngineManager
object EvalTest{
def main(args: Array[String]){
val e = new ScriptEngineManager().getEngineByName("scala")
e.put("a", 1)
e.put("s", "String")
println(e.eval("""s"a is $a, s is $s""""))
}
}
要使此应用程序正常工作,请确保包含库依赖项。
libraryDependencies += "org.scala-lang" % "scala-compiler" % scalaVersion.value