背景
我想要向远程actor发送一个closure。远程actor应该在其数据上运行closure并返回结果。也许这并不可取,但出于好奇,这就是我现在想做的事情
但是我注意到,如果一个closure被创建为匿名函数,它也会捕获外部对象并尝试进行编组,如果外部对象不可序列化,则会失败,就像这种情况。
class Client(server: ActorRef) extends Actor {
var every = 2
override def preStart() = {
println("client started. sending message....")
server ! new Message((x) => x % every == 0)
}
}
上面的代码在调用远程actor时会生成异常。我可以在方法
preStart()
中定义一个本地变量:val every_ = every
,并用它替换actor成员变量。但我觉得这是一种变通方法而不是解决方案。如果闭包稍微复杂一些,我将不得不非常小心。另一种方法是定义一个从
Function1[A,B]
继承的类,并发送其实例作为闭包。class MyFunc(every : Int) extends Function1[Int,Boolean] with Serializable {
def apply(v1 :Int) : Boolean = {
v1 % every == 0
}
}
server ! new Message(new MyFunc(every))
但这将闭包定义与其使用的位置分开,破坏了使用函数式语言的整个目的,并使得定义闭包逻辑变得更加困难。
具体问题
我是否可以推迟定义Function1.apply
的主体,并在我从本地定义的闭包创建MyFunc
实例时分配apply
的主体?
例如:
server ! new Message(new MyFunc(every){ // not valid scala code
x % every == 0
})
every
是一个本地变量吗?
基本上,我想结合这两种方法,即将 Function1
的一个对象和在创建 Function1
实例的地方定义的匿名函数的函数体一起发送到远程 actor。
谢谢!
Funtion1[A,B]
的apply()
方法的主体?就像在Java中实例化接口时定义匿名类方法一样。 - weimaFunction1
的主体。谢谢 :) - weima