Scala - 用于理解的模式匹配结果

时间:2013-07-24 01:08:50

标签: scala coding-style pattern-matching for-comprehension

我目前正在对for-comprehension的结果进行模式匹配,如下所示

val validXsrf = for(
    cookie <- request.cookies.get("XSRF-TOKEN"); 
    header <- request.headers.get("X-XSRF-TOKEN"); 
    if cookie.value == header ) yield true;

validXsrf match {
   case Some(true) => callbackFunc();
   case None       => throw new XsrfException();
}

然而,这感觉有点过于冗长 - 是否有更清晰的表达方式?

理想情况下,我喜欢做类似

的事情
for(....) match { .... }

但是,如果没有将整个for-comprehension包含在括号中,Scala中似乎不可能出现这种情况。

是否有更清洁/更优雅的方式表达这种逻辑?

1 个答案:

答案 0 :(得分:2)

你可以将事情略有缩写(假设callbackFunc返回String):

def validXsrf():String = {
  val xsrf = for{
    cookie <- request.cookies.get("XSRF-TOKEN")
    header <- request.headers.get("X-XSRF-TOKEN") 
    if cookie.value == header
  } yield callbackFunc()

  xsrf.getOrElse(throw new XsrfException())
}

现在,如果您不想在失败案例中抛出异常,您可以重新定义validXsrf方法,而不是返回Try,如下所示:

def validXsrf():Try[String] = {
  val xsrf = for{
    cookie <- request.cookies.get("XSRF-TOKEN")
    header <- request.headers.get("X-XSRF-TOKEN") 
    if cookie.value == header
  } yield callbackFunc()

  xsrf.fold[Try[String]](Failure(new XsrfException()))(Success(_))
}