akka演员孩子的烦恼

时间:2017-08-24 08:22:15

标签: 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(PingActor.props, name) ! GetState

为什么?

1 个答案:

答案 0 :(得分:2)

简短回答

由于运营商优先级,只有在child(name)返回None时才会发送您的邮件,即调用getOrElse

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

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

答案很长

根据Scala language specification,Scala中的正常中缀操作是左关联的,并且从左到右进行评估。如果是这种情况,那么你的代码就可以了。

然而,还有运算符优先级规则允许通常的数学和逻辑运算而没有括号。根据他们的说法,!运算符的优先级高于getOrElse,并且在它之前进行评估,从而在'内部发送消息。