2013-07-24 21 views
0

我目前在换理解的结果进行模式匹配如下斯卡拉 - 图案匹配的结果对于理解

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的出现成为可能。

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

回答

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(_)) 
} 
+0

似乎在事后出奇明显。谢谢 :) –