2012-07-03 82 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 - 不完全是一种副作用 - 它只是另一种让你的手掌握你可以引用的变量名称的方法。 '_ *'匹配任何东西,所以是的,这有效地忽略了其余部分。 –