2015-03-29 5 views
14

podobne pytanie podobne: Convert match statement to partial function when foreach is used. Podobnie, IntelliJ prosi mnie o ulepszenie mojego kodu. Różnica polega na tym, że mogę używać wartości dla dopasowania:scala: konwersja instrukcji dopasowania do wzoru pasującego do anonimowej funkcji - z wartościami

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

Refaktoryzacja to do anonimowej funkcji wzór dopasowywania będzie wyglądać mniej więcej tak:

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

pamiętać, że w tym drugim przypadku nie można użyć _, ponieważ potrzebuję go dwa razy. Czy jest jakiś sposób użycia anonimowej funkcji dopasowywania wzorca?

Odpowiedz

20

Nie można użyć symbolu wieloznacznego _ tutaj, jego celem jest wskazanie, że nie zależy Ci na wartości, do której pasujesz.

Można użyć nazwany parametr:

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

bez żadnych ograniczeń nałożonych na nią, będzie on pasował do żadnej wartości. Zauważ, że kolejność case s jest ważna, ponieważ case x => ... pasuje do wszystkiego i zasadniczo skraca inne instrukcje case.


Tak na marginesie, nie sądzę swój somethingSpecial(_) robi to, co chcesz/oczekują go. Jest to tylko krótka wersja x => somethingSpecial(x), a nie somethingSpecial(matchMe).

+0

'f (_)' to 'x => f (x)'. I 'ks foreach {case _ => f (_)}' nie jest 'ks foreach {case x => f (x)}'. –

+0

Cholera. To nie jest dla mnie nowość. Wielkie dzięki, Marth! –

Powiązane problemy