我对此案感到惊讶。有什么想法为什么会发生这种情况?
每次都可以正常工作:
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
为什么?
答案 0 :(得分:2)
简短回答
由于运营商优先级,只有在child(name)
返回None
时才会发送您的邮件,即调用getOrElse
。
使用非中缀方法调用来避免这种情况:
child(name).getOrElse(actorOf(PingActor.props, name)) ! GetState
答案很长
根据Scala language specification,Scala中的正常中缀操作是左关联的,并且从左到右进行评估。如果是这种情况,那么你的代码就可以了。
然而,还有运算符优先级规则允许通常的数学和逻辑运算而没有括号。根据他们的说法,!
运算符的优先级高于getOrElse
,并且在它之前进行评估,从而在'内部发送消息。