سؤال

وأنا مبتدئا سكالا وهذه القطعة من التعليمات البرمجية يجعلني النضال.

هل هناك طريقة للقيام نمط مطابقة للتأكد من كل شيء أنا تمرير البيانات هي من النوع الصحيح؟ كما ترون لدي أنواع البيانات غريبة جدا ...

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
 }

...

هل كانت مفيدة؟

المحلول

وأعتقد مشكلتك هي أنك تريد أن تكون قادرة على باتن تطابق الخريطة التي تحصل عليها من 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
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top