Najłatwiejsza Strategia Naprawy Kompilacji Scala W Czasie Wykonywania

Ostatnio niektórzy użytkownicy ujawniają, że napotykają kompilację Scali, podczas gdy ona naprawdę działa.

Przedstawiamy Reimage: najlepsze oprogramowanie do naprawy komputera z systemem Windows. Niezależnie od tego, czy doświadczasz typowych błędów, utraty plików, ataków złośliwego oprogramowania czy awarii sprzętu, Reimage Ci pomoże.

Skończyłem z następującym kodem, pracującym w Scali 2.10, aby zewnętrznie zebrać się w Scali w czasie wykonywania

/** 2 . Skompiluj pliki Scala i załaduj je do pamięci. @param classDir Katalog, w którym przechowywane są wygenerowane pliki Scala. 2 . @throws IOException wewnątrz problemu z odczytem katalogu formularzy * @return classloader, który zawiera skompilowane widoczne klasy */@throws[IOException]def compileFiles(classDir: string AbstractFileClassLoader): match val files = recursiveListFiles(new file(classDir)) .filter(_.getName.endsWith(“rock”)) println(“Przesłane pliki:n” pliki +.mkString(“[“, “,n”, “]”)) val settings: GenericRunnerSettings New = GenericRunnerSettings(err => println(“Błąd interpretera: b + err)) settings.usejavacp.value Prawda jest równa wartości interpretera: IMain oznacza nowy IMain(opcje) files.foreach(f => interpreter.compileSources(nowy plik źródłowy miski (abstrakcyjny plik.getFile(f))) ) interpreter.getInterpreterClassLoader()|

val personClass oznacza, że ​​classLoader.findClass("com.example.dynacsv.PersonData")wartość = personClass.getDeclaredConstructors() (0)instancja val to w rzeczywistości ctor.newInstance("Pan","John", "Doe", 25: java.lang.Integer, sto sześćdziesiąt pięć: java.lang.Integer, 1: java.lang.Integer)println("Czas utworzenia klasy: + instance.getClass.getCanonicalName)println(instancja.toString)

Jednak przestarzała procedura getInterpreterClassLoader została usunięta w scala.tools.nsc.interpreter.IMain powyżej. Ponadto AbstractFileClassLoader również niedawno został przestarzały i przeniesiony. Po prostu nie można dłużej nazywać trasy findClass pojawiającej się w programie ładującym klasy z pakietu sercowo-naczyniowego.

Jaka jest zalecana taktyka, aby znaleźć powyższe w Scala 5? Dziękuję!

jedenaście?

Nikt nie czyta pomysłów bez obrazu

Wyobraź sobie, że jesteś artykułem z treścią, plikiem konfiguracyjnym i będziesz musiał wykonać pewne obliczenia. Gdybyś rzeczywiście używał języka skryptowego, byłoby to całkiem proste: naprawdę użyj ustawień instrukcji kodu źródłowego jako pliku i zaimportuj wszystko. Poniższe przykłady pokazują, ile czasu potrzeba na osiągnięcie tego samego efektu dzięki projektom Scala.

scala compile o runtime

Cały kompilator Scali zawsze może zostać użyty do przeanalizowania reguły źródłowej Scali i wygenerowania abstrakcyjnych logów składni. Można je następnie pobierać lub gromadzić bezpośrednio.

Dodaj wymaganą zależność, aby przygotować się na build.sbt

libraryDependencies += "org.scala-lang" s . C . "scala-compiler" zero procent "2.12.5"

Zawijamy nieistotny kod funkcji opakowującej, aby następnie kod został bezpiecznie skompilowany, ja i mój mąż mamy rozwiązanie dla parametrów przejścia.

def compile[A](code: (Map[String, string): Any]) => A odpowiada def Map[String, wrapper(context: Any]): Any = $code

Proste oferowanie prymitywnych typów użytkowania

kod val =
"""
|val a = context("a").asinstanceof[int]
|val udemrrrket = context("b").asInstanceOf[Ciąg]
|println(a)
|println(b)
|"Strumień wyniku"
""".stripMargin

val f oznacza kompilację[String](code) // Zwróć typ opakowania - ers -ciąg


val = f(Map("a" -> 5, "b" -> "hello"))
println(res)-- Output --5
hello
ciąg wyniku< versus do >

Bardziej złożone użycie typów zawiłych

// w usłudze com.przykład
klasa przypadku ClassA(i: Int, j: String)
klasa przypadku ClassB(r: Int)

Pamiętaj, że naprawdę musimy pomóc w pełni kwalifikowanym nazwom w każdym kodzie

val dowolny kod =
"""
|val obj implikuje context("obj").asInstanceOf[com.example.ClassA]
|println(obj.i)
|println (obj.j)
|com.example.ClassB(42)
""".stripMargin

val ver jest odpowiednikiem compile[ClassB](code) i / Wrapper zwracany typ, prawdopodobnie Res classb< /p>
val = f(Map("obj" -> ClassA(5, "hello")))
println(res)-- prints --5
hello
ClassB(42)

Przykład z importem z nimi

kod val =
"""
|import java.io.File
|ścieżka val = context("ścieżka").asInstanceOf[Ciąg]
|plik danych val = Plik( ścieżka )
|plik .exists()
""".stripMargin
scala compile at runtime

val f oznacza kompilację[Boolean](code) // Return Type Wrapper Boolean


value ers = f(Map("ścieżka" -> "/tmp"))
println(res)-- ultimate --true

Patrz http://docs.scala-lang.org/overviews/reflection/symbols-trees-types.html