Was ist der beste Weg, um einen Code-Ausschnitt zu scala zu injizieren? etwas wie Eval in Javascript und GroovyScriptEngine. Ich möchte meine Regeln/Berechnungen/Formeln außerhalb der eigentlichen Datenverarbeitungsklasse behalten. Ich habe fast 100 Formeln, die ausgeführt werden müssen. Der Datenfluss ist für alle gleich, nur die Formeln ändern sich. Was ist der beste Weg, um es in Scala zu tun? und die Anzahl der Formeln wird mit der Zeit wachsen.Dynamische Code-Auswertung in Scala
Antwort
Sie könnten entweder scala-lang
API dafür oder twitter-eval
verwenden. Hier ist der Ausschnitt aus einem einfachen Anwendungsfall von 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
}
}
oder mit 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
}
}
Ich bin nicht in der Lage es im Moment zu kompilieren zu überprüfen, ob ich etwas verpasst haben, aber Sie sollten erhalten die Idee.
ist es möglich, eine Variable, dass passieren? also zum beispiel könnte man println (z) im code zum auswerten verwenden und es würde "test" drucken – Nicofisi
ich glaube nicht dass du kannst. Sie befinden sich in einem anderen Laufzeitkontext. Das ist also kein Scripting-ähnlicher Code-Injection. siehe: JSR-223: https://www.jcp.org/en/jsr/detail?id=223 – linehrr
Ich habe festgestellt, dass scala.tools.reflect.ToolBox
ist das schnellste Eval in Scala (gemessene Interpreter, twitter Eval und benutzerdefinierte Tool). Es ist 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. Benutzerdefinierte Steueranweisungen mit math.js und Codeauswertung
- 2. Dynamische Merkmal Unterschied von Scala 2,9-2,10
- 3. Dynamische Möglichkeit, Positionsdatei mit Scala zu lesen
- 4. Spark Scala Dynamische Spaltenauswahl von DataFrame
- 5. Spark Scala Dynamische Erstellung von Serializable-Objekt
- 6. Wie erfolgt die dynamische Skriptauswertung in C#?
- 7. Kann ich dynamische Scala-Funktionen von Groovy aufrufen?
- 8. Dynamische Kompilierung mit scala 2.12 - von sbt Test
- 9. Scala-Spark Dynamische Aufruf von groupby und agg mit Parameterwerten
- 10. Scala AST in Scala
- 11. Dynamische SQL-Parameter mit Anorm und Scala Play Framework
- 12. Dynamische Vorlagen in Play Framework 2.0
- 13. in Scala
- 14. Anfänger: Scala-Typ Alias in Scala 2.10?
- 15. Dynamische Felder in JSON-Objekt für C3
- 16. Dynamische Regex in Ruby
- 17. Dynamische URLs in Laravel?
- 18. Dynamische Klassenerstellung in C#
- 19. dynamische regex in R
- 20. Dynamische String in WPF
- 21. Dynamische Auswahl in LINQ
- 22. Dynamische Vererbung in Python
- 23. Dynamische TypeOf in C#
- 24. Dynamische Tabellenpartitionierung in Postgres
- 25. Dynamische Dateinamen in vars_files
- 26. Schlüssel dynamische in config.yml
- 27. Dynamische Datenbindung in AngularJS
- 28. dynamische Direktiven in angularjs
- 29. Dynamische Zellbereiche in Formel
- 30. dynamische var in LinQ
Betrachten Sie diese Frage zu lesen - https://stackoverflow.com/questions/1183645/eval-in-scala – tuxdna