如何在akka中使用发送者ActorRef

时间:2017-03-06 13:06:51

标签: 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)
}

因为sender()是一个函数,在应用之前某人可能会更改context.sender()值

问题1 :非Future功能有真实性吗?或者像第一个版本一样安全写作?

问题2 :有什么方法可以这样写吗?

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

1 个答案:

答案 0 :(得分:2)

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

所以回答你的第一个问题:是的,只要你在第一个版本中这样做是安全的

  1. 不要将sender()返回的值分配给actor中的字段
  2. 在演员之外的某个地方传递该值
  3. 但是,我不建议将sender()的结果分配给变量。而不是那样,我建议调用sender()并直接发送消息(这将是我对问题2的回答):

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