Wiederholender Funktionsaufruf, bis wir nicht-leeres Optionsergebnis in Scala erhalten

7

Eine sehr neue Frage in Scala - wie mache ich "wiederhole Funktion, bis etwas zurückgegeben wird erfüllt meine Kriterien" in Scala?

Da ich eine Funktion habe, die ich aufrufen möchte, bis sie das Ergebnis zurückgibt, zum Beispiel wie folgt definiert:

%Vor%

Ich habe mir diese Lösung ausgedacht, aber ich habe das Gefühl, dass hässlich ist

%Vor%

oder äquivalent hässlich:

%Vor%

Ich habe wirklich das Gefühl, dass es eine Lösung ohne var gibt und ohne so viel Aufwand bei der manuellen Überprüfung, ob Option leer ist oder nicht.

Zum Vergleich scheint Java-Alternative, die ich sehe, hier viel sauberer zu sein:

%Vor%

Um die Verletzung noch schlimmer zu machen, wenn wir doSomethingWith(res) nicht brauchen und wir es nur von dieser Funktion zurückgeben müssen, sieht Scala vs Java so aus:

Scala

%Vor%

Java

%Vor%     
GreyCat 22.11.2012, 00:59
quelle

2 Antworten

14

Sie können Stream s continually Methode verwenden, um genau dies zu tun:

%Vor%

Oder (möglicherweise deutlicher):

%Vor%

Ein Vorteil dieses Ansatzes gegenüber der expliziten Rekursion (abgesehen von der Prägnanz) ist, dass es viel einfacher ist, daran zu basteln. Sagen wir zum Beispiel, dass wir entschieden haben, dass wir nur versuchen wollten, das Ergebnis tausend Mal zu bekommen. Wenn ein Wert vor diesem Zeitpunkt auftaucht, möchten wir, dass er in ein Some gehüllt wird, und wenn nicht, wollen wir ein None . Wir fügen unserem obigen Code nur ein paar Zeichen hinzu:

%Vor%

Und wir haben was wir wollen. (Beachten Sie, dass Stream faul ist, also auch wenn take(1000) vorhanden ist, wenn ein Wert nach drei Aufrufen von tryToGetResult auftaucht, wird er nur dreimal aufgerufen.)

    
Travis Brown 22.11.2012, 01:51
quelle
6

Wenn ich solche Nebenwirkungen mache, sterbe ich innerlich etwas, aber wie wäre es damit?

%Vor%

Dann nenne es so

%Vor%

Vielleicht möchten Sie lookupUntilDefined einen zusätzlichen Parameter geben, damit es eventuell aufhört, falls f niemals definiert wird.

    
drstevens 22.11.2012 01:17
quelle

Tags und Links