私が持っているとしましょう
trait fooTrait[T] {
def fooFn(x: T, y: T) : T
}
ユーザーが fooFn の独自の定義済み本体を使用して、fooTrait の新しいインスタンスをすばやく宣言できるようにしたいと考えています。理想的には、次のようなものが欲しい
val myFoo : fooTrait[T] = newFoo((x:T, y:T) => x+y)
仕事に。しかし、私はただすることはできません
def newFoo[T](f: (x:T, y:T) => T) = new fooTrait[T] { def fooFn(x:T, y:T):T = f(x,y); }
これはクロージャーを使用するため、プログラムが複数回実行されると異なるオブジェクトが生成されるためです。私が本当に必要としているのは、newFoo によって返されたオブジェクトの classOf を取得し、それを別のマシンで構築できるようにすることです。私は何をしますか?
ユースケースに興味がある場合は、Hadoop 用の Scala ラッパーを作成して実行できるようにしようとしています。
IO("Data") --> ((x: Int, y: Int) => (x, x+y)) --> IO("Out")
中間のものは、特定のインターフェイスを実装するクラスに変換する必要があり、クラス名だけから別のマシン (同じ jar ファイルを実行) でインスタンス化できます。
Scala は、(x:Int) => x+5 を Function1 のインスタンスに変換するシンタックス シュガーを使用して正しいことを行うことに注意してください。私の質問は、Scala 内部をハッキングせずにこれを複製できるかどうかです。これが Lisp である場合 (私が慣れているように)、これは簡単なコンパイル時マクロになります ... :sniff: