1

J'essaie de faire correspondre une valeur enum convertie en une chaîne contenue dans une collection. Voici le code:Quelle est la manière la plus idiomatique de Scala de faire correspondre un motif sur une Seq contenant des valeurs enum converties en chaînes?

object Foo extends Enumeration { 
    val ONE = Value("ONE") 
    val TWO = Value("TWO") 
} 

def check(seq: Seq[String]): Unit = seq match { 
    case Seq(Foo.ONE.toString) => println("match") 
    case _ => println("no match") 
} 

Il en résulte une erreur de compilation:

error: stable identifier required, but Foo.ONE.toString found. 
      case Seq(Foo.ONE.toString) => println("match") 

Quelle est la bonne façon d'utiliser mes Foo valeurs énumérées comme éléments de mon modèle correspondant à des déclarations de cas?

+1

Vous ne pouvez pas appliquer de fonction à l'intérieur d'un motif (il y a '.toString'). – cchantep

+0

Voulez-vous savoir si les éléments _all_ des 'Seq()' sont des chaînes de valeurs 'Foo', ou simplement _any_ d'entre eux? Avez-vous besoin de rapporter quels éléments correspondent, ou est-ce simplement un booléen (c'est-à-dire match trouvé/non trouvé)? – jwvh

+0

@cchantep l'a cloué sur la tête, j'aurais dû faire une correspondance sur 'case Seq (Foo.ONE)'. Merci à tous pour votre participation! – nmurthy

Répondre

1

J'aime la réponse de @cchantep, qui était d'éviter d'appeler .toString à l'intérieur de la correspondance de modèle et d'implémenter la méthode check comme suit:

def check(seq: Seq[Foo.Value]): Unit = seq match { 
    case Seq(Foo.ONE) => println("match") 
    case _ => println("no match") 
} 
1

Carte Retour à la première ENUM:

import scala.util.Try 

val enumSeq = seq map (x => Try(Foo.withName(x))) 

Ensuite, vous pouvez soit filtrer les Failure s ou match sur Seq(Success(ONE)), Seq(Success(ONE)), ..., Seq(Failure), etc.

1
def check(seq: Seq[String]): Unit = seq match { 
    case Seq(s @ _) if s == Foo.ONE.toString => println("match") 
    case _ => println("no match") 
}