2017-08-24 7 views
0

Ich bin wirklich überrascht von diesem Fall. Haben irgendwelche Körper irgendwelche Gedanken, warum das passiert?akka Schauspieler Kind Probleme

das funktioniert jedes Mal fein:

child(name) match { 
    case Some(ref) => ref ! Ping 
    case _ => 
    val ref = actorOf(PingActor.props, name) 
    ref ! Ping 
} 

Wir Schauspieler sind erstellen, wenn das Kind ist nicht vorhanden. Und dann senden Ping Nachricht.

Dieses irgendwann hängt am Fall von Akteur bereits vorhanden sind:

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

Warum?

+0

'aufgelegt' ... du meinst etwas gefriert? –

+0

Ja, beim Senden der Nachricht einfrieren – HoTicE

+0

Woher wissen Sie, dass es beim Senden der Nachricht einfriert und nicht beim Aufruf von 'getOrElse'? –

Antwort

2

Kurze Antwort

Wegen Operatorpräzedenz wird Ihre Nachricht nur gesendet, wenn child(name) kehrt None, das heißt getOrElse aufgerufen wird.

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

Lange Antwort in Scala sind links-assoziativ,

Wie pro Scala language specification, normalerweise Infix Operationen und ausgewertet werden von links nach rechts:

Verwendung nicht-Infix Methodenaufruf dies zu vermeiden . Wenn das der Fall wäre, würde Ihr Code gut funktionieren.

Es gibt jedoch auch Operator-Vorrangregeln, die übliche mathematische und logische Operationen ohne Klammern erlauben. Nach ihnen hat ! Operator höhere Priorität als getOrElse und wird davor ausgewertet, so dass die Nachricht von "nach innen" gesendet wird.

+0

Vielen Dank! – HoTicE

Verwandte Themen