Scala 如何在akka与发送方ActorRef合作

Scala 如何在akka与发送方ActorRef合作,scala,akka,higher-order-functions,Scala,Akka,Higher Order Functions,很久以前,我学会了以下代码: 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) } 因

很久以前,我学会了以下代码:

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()是一个函数,在应用之前,有人可能会更改上下文。sender()值

问题1:非未来函数是否成立?还是像第一个变体那样写比较安全

问题2:有这样的写作方法吗

def receive = {
  case x: Foo => sendrer() {s => doSome(s, x)}
}
只要执行给定消息的接收行为,
sender()
的结果将保持不变

所以要回答你的第一个问题:是的,像第一个变体那样做是安全的,只要你愿意

  • 不要将
    sender()
    返回的值赋给actor中的字段
  • 将该值传递到演员之外的某个地方
  • 但是,我不建议将
    sender()
    的结果分配给变量。与此相反,我建议调用
    sender()
    并直接向其发送消息(这将是我对问题2的回答):

    你所说的“非未来函数是否存在真理”是什么意思?你的参与者中是否有返回未来的函数?
    def receive = {
      case x: Foo => doSome(x)
    }
    
    def doSome(msg: Foo) = {
      // your logic here
      sender() ! msg
    }