2015-03-29 10 views
14

wie ähnliche Frage: Convert match statement to partial function when foreach is used. In ähnlicher Weise bittet IntelliJ mich, meinen Code zu verbessern. Der Unterschied ist, dass ich Werte für den Abgleich verwenden:scala: Konvertieren von Übereinstimmungsanweisung in Mustererkennung anonyme Funktion - mit Werten

val matchMe = "Foo" 
keys.foreach(key => 
    key match { 
    case `matchMe` => somethingSpecial() 
    case _ => somethingNormal(key, calcWith(key)) 
    }) 

dieses Refactoring zu einem anonymen Pattern-Matching-Funktion wäre so etwas wie folgt aussehen:

keys.foreach { 
    case `matchMe` => somethingSpecial(_) 
    case _ => somethingNormal(_, calcWith(_)) //this doesn't work 
} 

Beachten Sie, dass im zweiten Fall, ich nicht verwenden können, _ seit ich es zweimal brauche. Gibt es eine Möglichkeit, eine anonyme Pattern-Matching-Funktion zu verwenden?

Antwort

20

Sie können den Platzhalter _ hier nicht verwenden, um anzuzeigen, dass Sie den Wert, mit dem Sie übereinstimmen, nicht interessieren.

Sie können einen benannten Parameter verwenden:

keys.foreach { 
    case `matchMe` => somethingSpecial(matchMe) 
    case nonSpecialKey => somethingNormal(nonSpecialKey, calcWith(nonSpecialKey)) 
} 

Ohne darauf gelegt Einschränkungen, wird es einen beliebigen Wert entsprechen. Beachten Sie, dass die Reihenfolge case s wichtig ist, da case x => ... mit allem übereinstimmen und im Wesentlichen andere case Anweisungen abkürzen wird.


Als beiseite, ich glaube nicht, Ihre somethingSpecial(_) tut, was Sie wollen/es erwarten. Es ist nur eine kurze Version von x => somethingSpecial(x), nicht somethingSpecial(matchMe).

+0

'f (_)' ist 'x => f (x)'. Und 'ks foreach {Fall _ => f (_)}' ist nicht 'ks foreach {Fall x => f (x)}'. –

+0

Verdammt. Das ist eigentlich nicht neu für mich .. Vielen Dank Marth! –

Verwandte Themen