2017-08-24 287 views
0

我真的被这种情况感到惊讶。有任何想法为什么会发生这种情况?阿卡演员的孩子的烦恼

​​

我们,如果孩子是不存在的创建演员:

这个每次工作正常。 然后发送Ping消息。

这一段时间对演员的情况下挂断已经存在:

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

为什么?

+0

'挂up' ......你的意思是冻结? –

+0

是,冷冻时发送消息 – HoTicE

+0

你怎么知道在发送消息时,它冻结,而不是调用'getOrElse'什么时候? –

回答

2

简短的回答

由于运算符优先级的,只有当child(name)返回None,即getOrElse调用你的消息被发送。

使用非缀方法调用,以避免这种情况:

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

龙答案

Scala language specification,在斯卡拉通常缀操作是左结合,并从左至右进行评估。如果是这种情况,你的代码就可以正常工作。

然而也存在操作者的优先级规则,其允许在没有括号通常的数学和逻辑操作。据他们说,操作者!具有比getOrElse更高的优先级,并在它之前评估,从而从“内部”发送消息。

+0

非常感谢! – HoTicE