10

重複の可能性:
Scala の「eval」

scala がコンパイル済み言語であることは知っていますが、動的にクラスを jvm にロードできること、実行時に scala コンパイラを呼び出すことができることも知っています。スクリプト言語が可能なはずです。

そのため、実行するために必要なタスクがいくつかあります。

簡単な解釈:

val src = """ println("Hello World") """
interpret(src)

外部関数を呼び出します:

object A{
    def foo = 
        println("Hello World")
}

val src = """ A.foo """
interpret(src)

機能を実装します。

trait T{
    def foo:String
}

val src = """ class A extends T{ def foo = "Hello World" } """
interpret(src)
val t = loadClassAndCreatInstance.asInstanceOf[T]
println(t.foo)

私のすべての問題の解決策を得ることができれば素晴らしいことです。

4

2 に答える 2

5

どういうわけか、スクリプト言語として scala を使用する方法をすでに見つけましたが、まだ classLoader に問題があります。

object O{
  def foo = println("Hello World in object O")
}

trait T{
  def foo:String
}

object MyInterpreter extends App{
  val srcA = 
  """ 
  println("Hello World from srcA") 
  """

  val srcB = """ O.foo """

  val srcC = """ 
  class A extends T{ 
    def foo = "Hello World from srcC"
    override def toString = "this is A in a src"
  }
  """


  val out = System.out
  val flusher = new java.io.PrintWriter(out)

  val interpreter = {
  val settings = new import scala.tools.nsc.GenericRunnerSettings( println _ )
  new scala.tools.nsc.interpreter.IMain(settings, flusher)
  }

  interpreter.interpret(srcA)
  interpreter.interpret(srcB)
  interpreter.compileString(srcC)

  val classA = interpreter.classLoader.findClass("A")

  println(classA)

  val constructors = classA.getDeclaredConstructors
  val myinstance = constructors(0).newInstance()

  println(myinstance)

  //this still throws an classCastException
  myinstance.asInstanceOf[T].foo 
  //but everything else works
}
于 2011-05-28T22:00:59.803 に答える
1

ここで私の答えを参照してください:Scalaの「eval」

(あなたはすでに scala インタラクティブ モードと、Scala 互換のシバン#!ラインを使用して実行可能なスクリプトを作成する方法を知っていると思います。)

于 2011-05-28T20:24:49.457 に答える