【问题标题】:pattern matching on a series of values in scalascala中一系列值的模式匹配
【发布时间】:2010-12-20 20:10:34
【问题描述】:

我是 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
 }

...

【问题讨论】:

    标签: scala pattern-matching


    【解决方案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
    }
    

    【讨论】:

    • 感谢您的回答,但它实际上不起作用。我不确定我是否做对了所有事情,但是在这两种情况下,使用 ant 编译时都会出现此错误。错误:模式类型与预期类型不兼容; [scalac] found : String [scalac] required: Option[Any] [scalac] case s: String => Some(s) stop to string, maps 似乎没问题..
    • 用 Some 包装每个值可以解决问题。 case(Some(templateText: String), Some(...)) 感谢您的开始
    猜你喜欢
    • 2015-07-27
    • 2018-10-01
    • 2011-05-24
    • 2012-10-14
    • 2017-10-14
    • 2012-10-31
    • 1970-01-01
    • 2016-05-17
    • 2021-12-17
    相关资源
    最近更新 更多