我真的被这种情况感到惊讶。有任何想法为什么会发生这种情况?阿卡演员的孩子的烦恼
我们,如果孩子是不存在的创建演员:
这个每次工作正常。 然后发送Ping消息。
这一段时间对演员的情况下挂断已经存在:
child(name) getOrElse actorOf(PingActor.props, name) ! GetState
为什么?
我真的被这种情况感到惊讶。有任何想法为什么会发生这种情况?阿卡演员的孩子的烦恼
我们,如果孩子是不存在的创建演员:
这个每次工作正常。 然后发送Ping消息。
这一段时间对演员的情况下挂断已经存在:
child(name) getOrElse actorOf(PingActor.props, name) ! GetState
为什么?
简短的回答
由于运算符优先级的,只有当child(name)
返回None
,即getOrElse
调用你的消息被发送。
使用非缀方法调用,以避免这种情况:
child(name).getOrElse(actorOf(PingActor.props, name)) ! GetState
龙答案
按Scala language specification,在斯卡拉通常缀操作是左结合,并从左至右进行评估。如果是这种情况,你的代码就可以正常工作。
然而也存在操作者的优先级规则,其允许在没有括号通常的数学和逻辑操作。据他们说,操作者!
具有比getOrElse
更高的优先级,并在它之前评估,从而从“内部”发送消息。
非常感谢! – HoTicE
'挂up' ......你的意思是冻结? –
是,冷冻时发送消息 – HoTicE
你怎么知道在发送消息时,它冻结,而不是调用'getOrElse'什么时候? –