可以说我有
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: