2017-08-24 5 views
0

このケースでは本当に驚いています。これがどうして起こるのか、どんな身体もありますか?アクター児童トラブル

​​

私たちは、子供が存在していない場合は、俳優を作成し、次のとおりです。

これは毎回正常に動作します。 そして、Pingメッセージを送信します。

これいつかは俳優の場合にハングアップし、既に存在します。

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

なぜ?そのため、演算子の優先順位の

+0

「ハングアップ」...何かが凍っていることを意味しますか? –

+0

はい、メッセージを送信するときにフリーズします。 – HoTicE

+0

メッセージを送信するときにフリーズし、 'getOrElse'を呼び出すときにどのようにフリーズしますか? –

答えて

2

短い答え

は、あなたのメッセージはchild(name)戻りNoneは、すなわちgetOrElseが呼び出されたときにのみ送信されます。

使用非中置メソッド呼び出しは、これを避けるために:

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

長い答えScala language specificationあたりとして

、Scalaでは通常、中置演算は左結合であり、左から右に評価されています。それがここに当てはまる場合、あなたのコードはうまくいくでしょう。

しかし、かっこなしの通常の数学的および論理的操作を可能にする演算子優先ルールもあります。それらによると、!演算子はgetOrElseよりも高い優先順位を持ち、その前に評価され、したがって 'inside'からのメッセージを送信します。

+0

ありがとうございます! – HoTicE