Akka 阿克卡演员儿童问题

Akka 阿克卡演员儿童问题,akka,akka-actor,Akka,Akka Actor,我真的对这个案子感到惊讶。有人想过为什么会发生这种事吗 每次这样都很好: child(name) match { case Some(ref) => ref ! Ping case _ => val ref = actorOf(PingActor.props, name) ref ! Ping } 如果子对象不存在,我们将创建参与者。 然后发送Ping消息 如果参与者已经存在,这有时会挂断: child(name) getOrElse actorOf(Pin

我真的对这个案子感到惊讶。有人想过为什么会发生这种事吗

每次这样都很好:

child(name) match {
  case Some(ref) => ref ! Ping
  case _ =>
    val ref = actorOf(PingActor.props, name)
    ref ! Ping
}
如果子对象不存在,我们将创建参与者。 然后发送Ping消息

如果参与者已经存在,这有时会挂断:

child(name) getOrElse actorOf(PingActor.props, name) ! GetState

为什么?简短的回答

由于运算符的优先级,只有当
子(名称)
返回
时,才会发送消息,即调用
getOrElse

使用非中缀方法调用可避免这种情况:

child(name).getOrElse(actorOf(PingActor.props, name)) ! GetState
长答案

根据,Scala中的中缀操作通常是左关联的,并且从左到右求值。如果在这里是这样的话,你的代码就可以正常工作了


然而,也有运算符优先规则,允许不带括号的常规数学和逻辑运算。据他们说,
运算符的优先级高于getOrElse,并在其之前进行评估,从而从“内部”发送消息。

简短回答

由于运算符的优先级,只有当
子(名称)
返回
时,才会发送消息,即调用
getOrElse

使用非中缀方法调用可避免这种情况:

child(name).getOrElse(actorOf(PingActor.props, name)) ! GetState
长答案

根据,Scala中的中缀操作通常是左关联的,并且从左到右求值。如果在这里是这样的话,你的代码就可以正常工作了


然而,也有运算符优先规则,允许不带括号的常规数学和逻辑运算。据他们说,
运算符的优先级高于
getOrElse
,并在它之前进行评估,因此从“内部”发送消息。

挂起
。。。你是说有些东西冻结了?是的,发送消息时冻结了你怎么知道它在发送消息时冻结了,而不是在调用
getOrElse
时冻结了?我只知道一件事-actor在这个字符串上冻结了,而getOrElse在我将其更改为匹配时冻结了-它开始工作得很好我从公认的答案中得到,它与冻结无关,只是一条消息没有被发送。通过更准确地描述问题,您将更快地得到更好的答案。
挂断
。。。你是说有些东西冻结了?是的,发送消息时冻结了你怎么知道它在发送消息时冻结了,而不是在调用
getOrElse
时冻结了?我只知道一件事-actor在这个字符串上冻结了,而getOrElse在我将其更改为匹配时冻结了-它开始工作得很好我从公认的答案中得到,它与冻结无关,只是一条消息没有被发送。通过更准确地描述问题,你会更快地得到更好的答案。