2009-11-26 10 views
3

Je suis un débutant Scala et ce morceau de code me fait du mal.modèle correspondant à une série de valeurs dans scala

Existe-t-il un moyen de faire correspondre les modèles pour s'assurer que tout ce que je passe à Data est du type correct? Comme vous pouvez le voir, je assez étranges ... types de données

class Data (
val recipient: String, 
val templateText: String, 
val templateHtml: String, 
val blockMaps: Map[String,List[Map[String,String]]], 
templateMap: Map[String,String] 
) 

...

val dataParsed = JSON.parseFull(message) 
dataParsed match { 
case dataParsed: Map[String, Any] => { 
    def e(s: String) = dataParsed get s 
    val templateText = e("template-text") 
    val templateHtml = e("template-html") 
    val recipient = e("email") 
    val templateMap = e("data") 
    val blockMaps = e("blkdata") 

    val dependencies = new Data(recipient, templateText, templateHtml, blockMaps, templateMap) 
    Core.inject ! dependencies 
} 

...

Répondre

1

Je suppose que votre problème est que vous voulez être en mesure de correspondre à la patten carte que vous obtenez de parseFull(), mais la carte n'a pas un unapply.

vous pouvez donc correspondant au critère chaque valeur unique, fournissant une valeur par défaut si ce n'est pas du type correct:

val templateText: Option[String] = e("template-text") match { 
    case s: String => Some(s) 
    case _ => None 
} 

Ou mettre temporairement toutes les données dans une structure qui peut être modèle adapté:

val data = (e("template-text"), e("template-html"), e("email"), e("data"), 
      e("blkdata")) 

val dependencies: Option[Data] = data match { 
    case (templateText: String, 
     templateHtml: String, 
     blockMaps: Map[String,List[Map[String,String]]], 
     templateMap: Map[String,String]) => 
    Some(new Data(recipient, templateText, templateHtml, blockMaps, templateMap)) 
    case _ => None 
} 
+0

merci de votre réponse, mais cela ne fonctionne pas réellement. Je ne suis pas sûr que je fais tout correctement, mais je reçois cette erreur lors de la compilation avec fourmi, dans les deux cas. erreur: le type de modèle est incompatible avec le type attendu; [scalac] trouvé: String [scalac] requis: Option [Tous] [scalac] \t \t \t \t cas s: String => Certains (s) arrête à la chaîne, des cartes semble être bien .. – flagZ

+0

chaque emballage value with Some résout le problème. case (Some (templateText: String), Some (...)) merci pour le début – flagZ

Questions connexes