0

我真的对这个案子感到惊讶。有任何想法为什么会发生这种情况?

每次都可以正常工作:

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

为什么?

4

1 回答 1

2

简短的回答

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

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

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

长答案

根据Scala 语言规范,通常 Scala 中的中缀操作是左关联的,并且从左到右进行评估。如果是这种情况,您的代码将可以正常工作。

然而,也有运算符优先规则允许通常的数学和逻辑运算而无需括号。根据他们的说法,!操作员的优先级高于getOrElse并在其之前进行评估,因此从“内部”发送消息。

于 2017-08-24T11:42:58.047 回答