作为演员 child 烦恼

akka actor child troubles

我真的很惊讶这个案例。有没有人想过为什么会这样?

这每次都工作正常:

child(name) match {
  case Some(ref) => ref ! Ping
  case _ =>
    val ref = actorOf(PingActor.props, name)
    ref ! Ping
}

如果 child 不存在,我们将创建演员。 然后发送Ping消息。

这有时会在演员已经存在的情况下挂断:

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

为什么?

简答

由于运算符优先级,您的消息仅在 child(name) returns None 时发送,即 getOrElse 被调用。

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

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

长答案

根据 Scala language specification,Scala 中的中缀运算通常是左关联的,并且从左到右求值。如果是这种情况,您的代码就可以正常工作。

然而,也有运算符优先级规则,允许不带括号的常规数学和逻辑运算。根据他们的说法,! 运算符的优先级高于 getOrElse 并且在它之前被评估,因此从 'inside'.

发送消息