2017-03-23 4 views
0

私はいくつかのメソッドを含むScalaアプリケーションを持っています。私は、それらのメソッドのサブセットのリストをどこかのテキストファイルに格納したいと考えています。私のアプリケーションが実行されるとき、私はそこに指定したメソッドをテキストファイルに読み込ませます。どのようにそれを行うにはどのようなアイデア?Scala:テキストファイルで実行するメソッドのリストを格納

私は、メソッド名を含むScala(List [Int => Int]など)の関数リストを作成してから、そのリストを反復することができます。問題は、テキストファイルからそのリストを動的に作成し、Scalaにプレーンテキスト文字列だけでなく、メソッド名を与えることを認識させる方法です。

ありがとうございました。

+1

を実行する事前定義済みの可能な方法のリストを持っていますか、またはあなたがどんな機能を持ってできるようにしたいんあなたのリスト? –

+0

私はあなたがリフレクションを使うべきだと確信しています。私はスカラ反射に慣れていませんが、ここには良いリンクがあります:http://docs.scala-lang.org/overviews/reflection/overview.html。ランタイムタイプのメンバへのアクセスと呼び出しを参照してください。 – Joe

+0

理想的には、どのような関数でも可能です。私は可能なメソッドのリストを作成することができます。これは、それを動作させる方法のアイデアを与えてくれます。 –

答えて

0

適切なScala構文でテキストファイルにメソッド呼び出しを保存する場合、小さなクラスラッパーを追加することができます(下記の例を参照)。 (アプリで)How to invoke the Scala compiler programmatically?に示すように、コンパイラを呼び出して、オブジェクトがコンパイルされてい、その後、ThingsToDoWhenAppStarts.methodToCallFromApp()

package com.myco.compcall 
import scala.tools.nsc._ 
import java.io._ 
object MyApp { 
    def main(args: Array[String]): Unit = { 
    val fn = "/MyTextFile.txt" 
    val f = new File(getClass.getResource(fn).toURI) 
    val s = new Settings() 
    s.embeddedDefaults[ThingsToDoWhenAppStarts] 
    s.outdir.value = "target/scala-2.11/classes" 
    val compiler = new Global(s) 
    val testFiles = List(f.getAbsolutePath) 
    val runner = new compiler.Run() 
    runner.compile(testFiles) 
    val ftfCls = Class.forName("com.myco.compcall.FromTextFile") 
    val ftf = ftfCls.newInstance().asInstanceOf[ThingsToDoWhenAppStarts] 
    ftf.methodToCallFromApp() 
    } 
    def method1(): Unit = { 
    println("Method1") 
    } 
    def method2(s: String): Unit = { 
    println(s"Method2: $s") 
    } 
} 
abstract class ThingsToDoWhenAppStarts { 
    def methodToCallFromApp(): Unit 
} 
// ---------- ---------- ---------- // 
// src/main/resources/MyTextFile.txt 
package com.myco.compcall 
class FromTextFile extends ThingsToDoWhenAppStarts { 
    def methodToCallFromApp(): Unit = { 
     MyApp.method1() // a call to a method defined in the app 
     MyApp.method2("an argument") // a call to a method defined in the app 
    } 
} 
関連する問題