3 votes

filtrage sur une série de valeurs en scala

Je suis un débutant en Scala et ce bout de code me donne du fil à retordre.

Existe-t-il un moyen de faire une correspondance de motifs pour s'assurer que tout ce que je passe à Data est du bon type ? Comme vous pouvez le voir, j'ai des types de données assez étranges...

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
 }

...

1voto

Ben James Points 41165

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

Ainsi, vous pourriez effectuer une correspondance par motif pour chaque valeur, en proposant une valeur par défaut si elle n'est pas du bon type :

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 comparée à un modèle :

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
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X