Umfang der Variablen in der case guard-Anweisung von scala

8

Für die Entwicklung von Aufzügen muss ich manchmal match - case -Anweisungen wie folgt verwenden. (Umgeschrieben auf einfache Scala für leichteres Verständnis.) Eine Anmerkung zu ihnen: Dies sind tatsächlich verschiedene Teilfunktionen, die in verschiedenen Teilen des Codes definiert sind. Daher ist es wichtig, dass eine Case-Anweisung in oder vor dem Guard fehlschlägt, um den anderen Teil zu haben Funktionen ausgewertet (wenn Übereinstimmung fehlschlägt, das ist).

%Vor%

Um zu wissen, dass die case -Anweisung erfolgreich ist, muss ich die Datenbank mit findInDb abfragen und prüfen, ob das Ergebnis gültig ist. Danach muss ich es erneut aufrufen, um den Wert zu verwenden.

Mache etwas wie

%Vor%

funktioniert nicht, da der Bereich von res dann auf die geschweiften Klammern beschränkt ist.

Ich kann natürlich ein var res = _ außerhalb definieren und ihm zuweisen, aber ich fühle mich nicht gut dabei.

Ist es möglich, eine Variable innerhalb der Wache zu deklarieren? Wenn es möglich ist, case r@Req(…) zu machen, warum nicht case r@Req() if res@(r.isDefined) ?

    
Debilski 20.08.2010, 15:38
quelle

5 Antworten

9

Du bist wirklich sehr nah dran. Das fehlende Schlüsselelement ist die Verwendung eines Extrahierers anstelle eines Wächterausdrucks.

%Vor%

Extraktoren müssen nicht nur Informationen zurückgeben, die bereits in ihren Argumenten vorhanden sind, das ist nur der übliche Anwendungsfall. Sie können tatsächlich jede Teilfunktion verwenden, sie zu Option heben und in der Lage sein, Informationen über die Definition der Funktion und ihren Wert zu finden.

    
Dave Griffith 20.08.2010 16:05
quelle
3

versuche das:

%Vor%

Dann können Sie in Ihrer Fallanweisung Folgendes tun:

%Vor%     
Rodolfo Hansen 04.04.2013 13:40
quelle
1

Was ist falsch daran, den if-Ausdruck in die case-Anweisung umzuwandeln?

%Vor%     
Ken Bloom 20.08.2010 17:37
quelle
1

Sie könnten ein wenig Infrastruktur erstellen, damit Sie eine Variable auf eine weniger exponierte Weise umschließen können:

%Vor%

Alternativ können Sie die Arbeit von => in die Bedingung verschieben, indem Sie map :

verwenden %Vor%     
Rex Kerr 20.08.2010 18:50
quelle
0

Hast du case r @ Req() if res@(r.isDefined) versucht?

%Vor%     
Randall Schulz 20.08.2010 15:58
quelle