作为演员 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'.
发送消息
我真的很惊讶这个案例。有没有人想过为什么会这样?
这每次都工作正常:
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'.