2013-07-24 29 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

似乎在事後出奇明顯。謝謝 :) –