將一段代碼注入scala的最佳方式是什麼?像JavaScript和GroovyScriptEngine中的eval。我想保留我的規則/計算/公式以外的實際數據處理類。我有接近100+的公式被執行。所有數據流都相同,只有公式發生變化。什麼是最好的方式來做它在斯卡拉?公式的數量將隨着時間的推移而增長。scala中的動態代碼評估
2
A
回答
3
您可以使用該或twitter-eval
要麼scala-lang
API。這裏是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
}
}
或與Twitter簡單的用例的片段:
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
}
}
我不能編譯它的那一刻,檢查我是否錯過了一些東西,但你應該得到這個想法。
2
我發現scala.tools.reflect.ToolBox
是Scala最快的eval(測量解釋,Twitter的評估和自定義工具)。它的API:
import scala.reflect.runtime.universe
import scala.tools.reflect.ToolBox
val tb = universe.runtimeMirror(getClass.getClassLoader).mkToolBox()
tb.eval(tb.parse("""println("hello!")"""))
相關問題
- 1. 如何動態評估C#代碼?
- 2. C#動態代碼評估,Eval,REPL
- 3. 如何在OCaml程序中動態評估一段OCaml代碼?
- 4. 代碼度量的評估
- 5. 評論我的Scala代碼
- 6. 源代碼邏輯評估
- 7. Nightmarejs代碼評估/然後
- 8. TopCoder如何評估代碼?
- 9. Winform中的Phalanger代碼評估C#
- 10. Python評估和評分學生代碼
- 11. 評估動態屬性
- 12. 是否有替代此代碼評估
- 13. 正確的方法來評估代碼
- 14. PHP + HTML代碼的PHP評估問題
- 15. 動態更改Facebook的評論代碼
- 16. 活動評估
- 17. 集評估和演示在代碼
- 18. 用microbenchmark評估多行代碼塊
- 19. RazorEngine評估問題.js代碼
- 20. 代碼沒有正確評估峯值
- 21. RMarkdown代碼評估,直到命令
- 22. 組織模式代碼塊評估
- 23. Ajax.Request顯然不評估JS代碼
- 24. 布爾評估C++ asm代碼
- 25. Casperjs評估迭代
- 26. SPEL表達式未動態評估
- 27. 評估模板文字動態
- 28. 評估一個動態數組密鑰
- 29. 動態評估el表達式
- 30. 選擇參數動態評估
考慮閱讀這個問題 - https://stackoverflow.com/questions/1183645/eval-in-scala – tuxdna