【发布时间】:2010-12-06 04:22:26
【问题描述】:
假设我有
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:
【问题讨论】:
-
您想将函数序列化到远程机器吗? “仅从类名”实例化类是什么意思。本例中的类或类名是什么?
-
基本上,我想要的是代码 Foo(Int => Int): 返回某些内容的字符串。然后,在加载了相同 jar 文件的另一台机器上,我想在该字符串上运行 Bar(s: String) : FooTrait[Int] 并让 Bar(Foo( fn ) ) 返回一个将 fn 作为方法的对象.一种方法是 def Foo(obj: FooTrait[Int]) = classOf(obj).toString 然后让 Bar 从类名创建一个新的类实例,但这需要将一个类传递给 Foo,而不是一个 lambda。
标签: scala syntactic-sugar