我想封闭发送到远程的演员。远程参与者应该对其数据运行关闭并发回结果。 可能这是不可取的,但为了好奇这就是我想做的事情现在
但我观察,如果一个封闭作为一个匿名函数创建的,它抓住了外部对象也并试图封送它,这如果外部对象不可序列化,则失败,如在这种情况下。
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
定义本地变量和到位的演员成员变量的使用它。但我觉得这是一种解决方法,而不是解决方案。如果封闭更复杂,我将必须非常小心。
另一种方法是定义继承自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
})
where every
是一个局部变量?
基本上我希望将两种方法结合起来,即发送的Function1
对象到远程演员与Function1
通过在其中创建Function1
实例地方定义一个匿名函数所定义的身体。
感谢,
我想你知道你在做什么,但我想以确保你知道发送关闭被认为是一个不好的做法,正如[文档](http://doc.akka.io/docs/akka/snapshot/general/actor-systems.html)中明确解释的那样 - Actor最佳实践alinea 3 – 2013-03-22 06:10:19
感谢您指出。或者我可以将这种行为封装在actor中并动态创建它?即基于闭包来决定演员的行为,而不是将闭包本身发送给演员。 – weima 2013-03-22 06:15:45
有很多你可以做的,但我有一种感觉,你正试图实现对特定问题的“错误”/尴尬的解决方案。我相信如果你编辑你的问题并描述你想达到的目标,你会在SO – 2013-03-22 06:26:01