2016-05-01 16 views
6

Ich versuche den folgenden Code zu verstehen, kann aber nicht.wie scala falten funktioniert?

es soll einen untergeordneten Akteur für ein Ereignis schaffen, wenn es nicht existiert, andernfalls sagt er, dass das Ereignis als es verbundener untergeordneter Akteur existiert.

context.child (name) .fold (create()) (_ => Sender()! EventExists)

Aber die Falte hier macht keinen Sinn für mich. Wenn context.child leer ist, erhalten wir die Erstellung und ich verstehe das. Aber wenn es Kinder gibt, werden wir immer noch warum schaffen?

Antwort

7

Akka des child kehrt ein Option

Wie Sie aus Option ‚s scaladoc sehen:

fach [B] (ifempty: ⇒ B) (f: (A) ⇒ B): B Gibt das Ergebnis von zurück, wobei f auf den Wert von scala.Option angewendet wird, wenn scala.Option nicht leer ist. Andernfalls wird der Ausdruck ifEmpty ausgewertet.

Oder machen es deutlich:

Diese (fold) entspricht scala.Option Karte f getOrElse ifempty.

So ist der erste Parameter von fold ist faul (Call-by-name) und wertet nur wenn Option leer. Der zweite Parameter (eine Funktion) wird nur aufgerufen, wenn Option nicht leer ist.

Experiment:

scala> Some(0).fold({println("1");1}){_ => println("2"); 2} 
2 
res0: Int = 2 

scala> None.fold({println("1");1}){_ => println("2"); 2} 
1 
res1: Int = 1 

Hier einige Lesungen über:

https://kwangyulseo.com/2014/05/21/scala-option-fold-vs-option-mapgetorelse/

Und einige Kritiker dieses Ansatzes:

http://www.nurkiewicz.com/2014/06/optionfold-considered-unreadable.html

Aber in Option.fold() ist der Vertrag anders: die Faltfunktion benötigt nur einen Parameter statt zwei. Wenn Sie meinen vorherigen Artikel über Falten lesen, wissen Sie, dass die reduzierende Funktion immer zwei Parameter benötigt: aktuelles Element und akkumulierter Wert (Anfangswert während der ersten Iteration). Aber Option.fold() benötigt nur einen Parameter: aktueller Optionswert! Dies bricht die Konsistenz, besonders wenn Realisierung Option.foldLeft() und Option.foldRight() korrekte Vertrag haben (aber es bedeutet nicht, dass sie lesbarer sind).

+0

Vielen Dank für die detaillierte Erklärung. Ich habe versucht, eine Erklärung zu erstellen, die auf der Faulheit des neutralen Arguments basiert, und da es in der Funktion nicht verwendet wird, da es nicht an zwei Parametern arbeitet, nehme ich an, dass es nie aufgerufen wird. Was nahe bei dir ist, die Wahrheit ist die Funktion nur einen Parameter zu nehmen. Es ist gut, diesen Unterschied zu kennen, danke. – MaatDeamon