Scala script in 2.11

我怕爱的太早我们不能终老 提交于 2019-12-18 05:16:03

问题


I have found an example code for a Scala runtime scripting in answer to Generating a class from string and instantiating it in Scala 2.10, however the code seems to be obsolete for 2.11 - I cannot find any function corresponding to build.setTypeSignature. Even if it worked, the code seems hard to read and follow to me.

How can Scala scripts be compiled and executed in Scala 2.11?

Let us assume I want following:

  • define several variables (names and values)
  • compile script
  • (optional improvement) change variable values
  • execute script

For simplicity consider following example:

I want to define following variables (programmatically, from the code, not from the script text):

val a = 1
val s = "String"

I want a following script to be compiled and on execution a String value "a is 1, s is String" returned from it:

s"a is $a, s is $s"

How should my functions look like?

def setupVariables() = ???

def compile() = ???

def changeVariables() = ???

def execute() : String = ???

回答1:


Scala 2.11 adds a JSR-223 scripting engine. It should give you the functionality you are looking for. Just as a reminder, as with all of these sorts of dynamic things, including the example listed in the description above, you will lose type safety. You can see below that the return type is always Object.

Scala REPL Example:

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`

An addition example as an application running under 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""""))
  }
}

For this application to work make sure to include the library dependency.

libraryDependencies +=  "org.scala-lang" % "scala-compiler" % scalaVersion.value


来源:https://stackoverflow.com/questions/29373551/scala-script-in-2-11

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!