2009-11-26 4 views
3

Я начинающий Scala, и этот кусок кода заставляет меня бороться.сопоставление шаблонов по ряду значений в scala

Есть ли способ сделать сопоставление с образцом, чтобы убедиться, что все, что я перехожу к Data, имеет правильный тип? Как вы можете видеть, у меня есть довольно странные типы данных ...

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 
} 

...

ответ

1

Я думаю, ваша проблема в том, вы хотите, чтобы иметь возможность соответствовать Паттен карту, которую вы получаете от parseFull(), но карта не имеет unapply.

Таким образом, вы могли бы шаблон матч каждое значение, обеспечивая по умолчанию, если это не правильный типа:

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

Или временно положить все данные в какую-либо структуру, которая может быть картина совпадений:

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

Благодарим вас за ответ, но он на самом деле не работает. Я не уверен, что делаю все правильно, но я получаю эту ошибку при компиляции с муравьем в обоих случаях. ошибка: тип шаблона несовместим с ожидаемым типом; [scalac] найдено: String [scalac] требуется: Опция [Любой] [scalac] \t \t \t \t сек Кейс: String => Некоторые (s) останавливается на строке, карты, кажется, хорошо .. – flagZ

+0

упаковка каждый значение с некоторыми решает проблему. case (Some (templateText: String), Some (...)) спасибо за начало – flagZ