如何在 akka 中使用发送者 ActorRef

How to work with the sender ActorRef in akka

很久以前,我了解到这段代码:

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)}
}

只要执行给定消息的接收行为,sender() 的结果将保持不变。

所以回答你的第一个问题:是的,只要你

像第一个变体一样这样做是安全的
  1. 不要将 sender() 返回的值分配给 actor 中的字段
  2. 将该值传递给你的 actor 之外的某个地方

但是,我不建议将 sender() 的结果分配给变量。相反,我建议调用 sender() 并直接向其发送消息(这将是我对问题 2 的回答):

def receive = {
  case x: Foo => doSome(x)
}

def doSome(msg: Foo) = {
  // your logic here
  sender() ! msg
}