2015-03-29 8 views
14

come la domanda simile: Convert match statement to partial function when foreach is used. Allo stesso modo, IntelliJ mi chiede di migliorare il mio codice. La differenza è che io uso i valori per l'abbinamento:scala: converti la dichiarazione della partita in corrispondenza della corrispondenza della funzione anonima - con i valori

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

Rifattorizzare questo per una funzione di pattern-matching anonima sarebbe simile:

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

Si noti che nel secondo caso, non posso usare _ poiché ne ho bisogno due volte. C'è un modo per utilizzare una funzione di corrispondenza dei pattern anonima qui?

risposta

20

Qui non è possibile utilizzare il carattere jolly _, il suo scopo è quello di indicare che non ti interessa il valore con cui stai confrontando.

È possibile utilizzare un parametro denominato:

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

Senza alcuna restrizioni su di esso, corrisponderà alcun valore. Si noti che l'ordine di case s è importante, poiché case x => ... corrisponde a qualsiasi cosa e sarà essenzialmente un collegamento ad altre istruzioni case.


Per inciso, non credo che il tuo somethingSpecial(_) fa ciò che si vuole/si aspettano di. È solo una versione breve di x => somethingSpecial(x), non somethingSpecial(matchMe).

+0

'f (_)' è 'x => f (x)'. E 'ks foreach {case _ => f (_)}' non è 'ks foreach {case x => f (x)}'. –

+0

Accidenti. Questo in realtà non è nuovo per me .. Grazie mille Marth! –