Scala中的“eval”

Scala可以用来编写Java应用程序吗?

我需要从Java中加载一段Scala代码,为它设置一个执行范围(由主机应用程序公开的数据),评估它并从中检索一个结果对象。

Scala文档展示了从Java调用编译的Scala代码是多么容易(因为它变成了常规的JVM字节码)。

但是,我怎样才能评估一个Scalaexpression式(从Java或者Scala中更简单)?

对于其他许多语言,还有javax.scripting接口。 Scala似乎不支持它,而且在Java / Scala互操作性文档中找不到任何依赖于提前编译的东西。

Scala不是一种脚本语言。 它可能看起来有点像脚本语言,人们可能会为此目的提倡它,但是它并不适合JSR 223脚本框架(面向dynamictypes语言)。 为了回答你原来的问题,Scala没有eval函数,就像Java没有eval 。 鉴于这些语言本质上是静态的,这样的function对于这两种语言都没有意义。

我的build议是:重新思考你的代码,这样你就不需要eval (你很less这样做,即使在Ruby这样的语言中也是如此)。 另外,也许你不想在你的应用程序的这个部分中使用Scala。 如果您确实需要eval ,请尝试使用JRuby。 JRuby,Scala和Java很好地结合在一起。 在Java中使用部分系统,在Scala中使用部分系统以及在Ruby中使用另一部分(需要使用eval )是相当容易的。

现在是2011年,你可以使用scala.tools.nsc.Interpreter

http://blog.darevay.com/2009/01/remedial-scala-interpreting-scala-from-scala/

Scala在2.11( https://issues.scala-lang.org/browse/SI-874 )中增加了对JSR-223的官方支持。

所以如果你在思考Daniel Spiewak目前接受的答案(关于不需要重新思考)的考虑之后仍然需要,那么这应该是官方的select。

你可以通过scala代码来模拟“eval”,把它包装在一个类中,编译这个类,使用reflection来创build一个新的实例,然后调用它。 这有点牵扯,scala编译器很慢(大约2秒)初始化,但它工作正常。

这里有一个库,名为“util-eval”: https : //github.com/twitter/util/

有问题的代码在这里: https : //github.com/twitter/util/blob/master/util-eval/src/main/scala/com/twitter/util/Eval.scala

它是这样工作的:

 val sum = Eval[Int]("1 + 1") // sum will be 2 

我不确定,如果这是一个好方法,但是我使用toolbox.parsetoolbox.eval解决了这个问题

要在Scala中有一个评估,你必须:

  1. 导入scala反映

libraryDependencies += "org.scala-lang" % "scala-reflect" % "2.11.7"

  1. 从工具箱使用eval:
  import scala.reflect.runtime.currentMirror import scala.tools.reflect.ToolBox val toolbox = currentMirror.mkToolBox() val as = "2*(2+3)" val compe = toolbox.eval(toolbox.parse(as)) println(compe.getClass) // prints class java.lang.Integer println(compe) // prints 10 

你总是可以使用scalac来编译一个scala类,然后dynamic地加载这个类。 但是我想这不是你想要的。