scala - scala中的动态代码评估

标签 scala eval scala-collections scalatest

将一段代码注入(inject)scala的最佳方法是什么?类似于 javascript 和 GroovyScriptEngine 中的 eval 。我想将我的规则/计算/公式保留在实际数据处理类之外。我有将近 100 多个公式要执行。所有的数据流都是相同的,只是公式发生了变化。在scala中最好的方法是什么?并且公式的数量会随着时间的推移而增长。

最佳答案

您可以使用 scala-lang API 或 twitter-eval .这是 scala-lang 的简单用例的片段

import scala.tools.nsc.Settings
import scala.tools.nsc.interpreter.IMain

object ScalaReflectEvaluator {

  def evaluate() = {
    val clazz = prepareClass
    val settings = new Settings
    settings.usejavacp.value = true
    settings.deprecation.value = true

    val eval = new IMain(settings)
    val evaluated = eval.interpret(clazz)
    val res = eval.valueOfTerm("res0").get.asInstanceOf[Int]
    println(res) //yields 9
  }

  private def prepareClass: String = {
    s"""
       |val x = 4
       |val y = 5
       |x + y
       |""".stripMargin
  }
}

或推特:
import com.twitter.util.Eval

object TwitterUtilEvaluator {

  def evaluate() = {
    val clazz = prepareClass
    val eval = new Eval
    eval.apply[Int](clazz)
  }

  private def prepareClass: String = {
    s"""
       |val x = 4
       |val y = 5
       |x + y
       |""".stripMargin
  }
}

我现在无法编译它来检查我是否遗漏了一些东西,但你应该明白了。

关于scala - scala中的动态代码评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39142979/

相关文章:

scala - 如何在 Play/Scala 中对 Controller 进行单元测试

scala 将 Int => Seq[Int] 转换为 Seq[Int => Int]

scala - 为什么我不能使用下划线对 List[Option] 进行平面映射?

c# - label 中的文本可以包含 eval 吗?

scala - scala中的无符号整数

java - 找不到符号 MODULE$

Lisp:为什么引入词法作用域后 `eval` 失宠了?

ocaml - "Eval"OCaml 中的字符串

scala - 采用隐式 CanBuildFrom 的方法不适用于 eta-expansion?

Scala:如何从 Set[K] 创建 Map[K,V] 和从 K 到 V 的函数?