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



我目前正在对a的结果进行模式匹配,以便理解如下

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 { .... }

然而,如果不将整个内容封装在括号中以便于理解,这在Scala中似乎是不可能的。

有没有一种更干净/更优雅的方式来表达这种逻辑?

您可以这样缩写(假设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(_))
}

最新更新