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:
Sie können Stream
s continually
Methode verwenden, um genau dies zu tun:
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:
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.)