背景
我想向远程演员发送闭包。远程参与者应该对其数据运行闭包并发回结果。 可能是不可取的,但出于好奇,这就是我现在想做的
但是我观察到,如果一个闭包是作为匿名函数创建的,它也会捕获外部对象并尝试对其进行编组,如果外部对象不可序列化,则会失败,就像在这种情况下一样。
class Client(server: ActorRef) extends Actor {
var every = 2
override def preStart() = {
println("client started. sending message....")
server ! new Message((x) => x % every == 0)
}
}
上面的代码在调用远程参与者时会产生异常。我可以在方法中定义一个局部变量preStart()
val every_ = every
并使用它代替演员成员变量。但我觉得这是一种解决方法而不是解决方案。如果关闭更复杂一点,我将不得不非常小心。
另一种方法是定义一个继承自的类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
并分配主体?apply
MyFunc
例如
server ! new Message(new MyFunc(every){ // not valid scala code
x % every == 0
})
every
局部变量在哪里?
基本上我想结合这两种方法,即将一个对象发送Function1
到远程参与者,其主体由在创建实例Function1
的地方定义的匿名函数定义。Function1
谢谢,