我目前正在对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中似乎不可能出现这种情况。
是否有更清洁/更优雅的方式表达这种逻辑?
答案 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(_))
}