2012-07-03 119 views
0

我試圖理解下面的代碼段是如何工作的,尤其是第2行,Seq(JsString(bar), _*)和3號線,must_,語法是令人費解給我解釋這行代碼在斯卡拉

val foo = (Json.parse(contentAsString(result)  
val Seq(JsString(bar), _*) = (foo \\ "bar") 
bar must_== "crazy" 

回答

7

線2是模式匹配,但使用val語法。 foo \\ "bar"返回Seq,您可以匹配;

Seq(JsString(bar), _*) 

意味着該物品必須匹配到Seq和第一項必須是一個JsString,其內容我們將調用bar,我們不關心其他部分(_*)。通常你會看到如下所示:

(foo \\ "bar") match { 
    case Seq(JsString(bar), _*) => // do something with bar 
    ... 
} 

但事實證明,您可以通過這種方式初始化val

此外,對於某些測試框架,must_==是一個方法名稱(方法可以是字母數字,後接下劃線,後跟符號)。我忘了哪個。但幾乎可以肯定的是,無論是什麼測試 - 無論是什麼和測試 - 都有一個隱含的轉換 - 無論有什麼方法。

+0

THanks,這解釋的東西。問題,所以'bar'被設置爲val作爲副作用?而'_ *'忽略剩下的'JsString'匹配? – Bob

+0

@Bob - 不完全是一種副作用 - 它只是另一種讓你的手掌握你可以引用的變量名稱的方法。 '_ *'匹配任何東西,所以是的,這有效地忽略了其餘部分。 –