web-dev-qa-db-fra.com

scala: convertir l'instruction de correspondance en fonction anonyme de correspondance de modèle - avec des valeurs

comme une question similaire: Convertir l'instruction de correspondance en fonction partielle lorsque foreach est utilisé . De même, IntelliJ me demande d'améliorer mon code. La différence est que j'utilise des valeurs pour l'appariement:

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

Refactoriser cela en une fonction de correspondance de modèle anonyme ressemblerait à ceci:

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

Notez que dans le deuxième cas, je ne peux pas utiliser _ puisque j'en ai besoin deux fois. Existe-t-il un moyen d'utiliser une fonction de correspondance de modèle anonyme ici?

21
Daniel Hanke

Vous ne pouvez pas utiliser le caractère générique _ Ici, son but est d'indiquer que vous ne vous souciez pas de la valeur à laquelle vous correspondez.

Vous pouvez utiliser un paramètre nommé:

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

Sans aucune restriction, il correspondra à n'importe quelle valeur. Notez que l'ordre des cases est important, car case x => ... Correspond à tout et raccourcira essentiellement les autres instructions case.


En passant, je ne pense pas que votre somethingSpecial(_) fait ce que vous voulez/attendez d'elle. Ce n'est qu'une version courte de x => somethingSpecial(x), pas somethingSpecial(matchMe).

30
Marth