2013-02-05 78 views
1

我一直在學習Scala,並決定使用json4s進行JSON解析。我決定使用XPath語法進行反序列化,並遇到了我以前從未見過的這種奇怪的語法。奇怪的案例類語法

val json = JsonMethods.parse("""{"meaningOfLife": 42}""") 
val JInt(x) = json\"meaningOfLife" 

的部分混淆我是該位就在這裏

val JInt(x) = ... 

我不能換我周圍發生的事情有想法,我甚至不知道如何尋找這樣的語法或它叫什麼。誰能幫我嗎? Scala是一種令人驚歎的語言,具有很多整潔的功能,我不習慣於其他語言,如C++和Java。

編輯

爲了澄清,我很困惑,因爲x是沒有定義,但它以某種方式被傳遞到隨後被分配到的json\"meaningOfLife"結果返回一個JValue的功能或構造。

編輯2

經過一番研究和玩弄,我想通了,這已經是與case類。我能夠運行下面的代碼。

case class MyCaseClass (x: Int) 
val MyCaseClass(x) = new MyCaseClass(5) 
println(x, x.getClass) // prints (5,int) 

其中,看了一些代碼後,讓我很好地理解發生了什麼。

val MyCaseClass(x) = MyCaseClass(5) 

是提取(因爲缺乏一個更好的詞),從實例MyCaseClassInt5並存儲到x,這意味着xInt類型。

在json4s的代碼中,JInt是運算符\返回的JValue。因此,JInt(x)正在取出BigInt(存儲在類JInt中),並將其從我收集的值中放入x

但我仍然有一個問題。這個過程叫做什麼?有沒有關於它的文檔?

回答

5

這就是所謂的「無可辯駁的模式匹配」,但它本質上等同於該位的代碼:

val json = JsonMethods.parse("""{"meaningOfLife": 42}""") 

val x = json match { 
    case JInt(xMatched) => xMatched 
} 

換句話說,無論如何類或任何提取適合聲明的左手側的格局可以這樣使用。

附錄:

的「無可辯駁」的意思是如果模式不能滿足一個MatchError將被拋出。