我有代码检查JSON对象是否具有有效的日期字段。我意识到我可能有一些(s)情况,然后在该函数中嵌套另一个“匹配”,但我想知道是否有更简洁的方法在顶级“匹配”中执行此操作。这是我尝试过的代码,但不会返回“成功”。我假设有一种方法可以实现这一点,因为很多人都在谈论scala模式匹配的稳健性。谢谢!
val p = """(\d\d\d\d)-(\d\d)-(\d\d)""".r
(json \ "date").validate[String].asOpt match {
case Some(p(date)) => Json.obj("success"->date)
case None => Json.obj("error"->"missing date")
case _ => Json.obj("error"->"invalid date")
}
答案 0 :(得分:5)
您可以这样写:
val p = """(\d\d\d\d)-(\d\d)-(\d\d)""".r
Option("2014-08-07") match {
case Some(p(year,month,day)) => println("Yay")
case None => println("Boo")
}
但如果有任何方法可以在那里获得非字符串,那么做两步的事情真的更好。特别是,如果您不知道它是Option[String]
而只是Any
,那么确定它是一个字符串是一个重要的单独步骤。你可以为它编写一个提取器:
object IsString {
def unapply(a: Any): Option[String] = a match {
case s: String => Some(s)
case _ => None
}
}
// Then Some(IsString(p(y,m,d)))
如果您不需要验证匹配的三个组,p(_*)
将只测试模式的存在。
(感谢som-snytt修复了一种误解,多年以来一直困扰着我。)