很久以前,我学会了比这段代码:
def doSome(ref: ActorRef, msg: AnyRef): Unit = {
... some routine ...
ref ! msg
}
def receive = {
case x: Foo => doSome(sender(), x)
}
必须是
...
def receive = {
case x: Foo =>
val s = sender()
doSome(s, x)
}
因为sender()是一个函数,在应用之前某人可能会更改context.sender()值
问题1 :非Future功能有真实性吗?或者像第一个版本一样安全写作?
问题2 :有什么方法可以这样写吗?
def receive = {
case x: Foo => sendrer() {s => doSome(s, x)}
}
答案 0 :(得分:2)
只要执行给定消息的接收行为,sender()
的结果将保持不变。
所以回答你的第一个问题:是的,只要你在第一个版本中这样做是安全的
sender()
返回的值分配给actor中的字段但是,我不建议将sender()
的结果分配给变量。而不是那样,我建议调用sender()
并直接发送消息(这将是我对问题2的回答):
def receive = {
case x: Foo => doSome(x)
}
def doSome(msg: Foo) = {
// your logic here
sender() ! msg
}