2015-02-04 19 views
0

我一直在使用這個json combinator幾個基本/標準的情況下,沒有真正理解它是如何工作的。一切都很好。ScalaJsonCombinator中的「和」是什麼(定義Writes時)?

現在我想讓自己準備好任何先進的病例可能會來;我需要了解代碼。

參考:https://www.playframework.com/documentation/2.3.x/ScalaJsonCombinators

我想我能理解閱讀次數:

implicit val locationReads: Reads[Location] = (
    (JsPath \ "lat").read[Double] and 
    (JsPath \ "long").read[Double] 
)(Location.apply _) 

它創建了一個讀取:

  1. 首先 - 當給予JsValue(通過其「讀取」方法) - 它拉動「lat」,然後是「long」。在這兩個中,它創建了一個元組(Double,Double)。 - https://www.playframework.com/documentation/2.3.x/api/scala/index.html#play.api.libs.json.Reads

  2. 然後,該元組被分配給Reads ...的部分函數,​​在這種情況下,該函數是由「Location.apply _」返回的。我試圖在REPL:

...

scala> val yowMan = Location.apply _ 
yowMan: (Double, Double) => Location = <function2> 

scala> yowMan(1, 2) 
res14: Location = Location(1.0,2.0) 

這部分功能作爲輸入採用(雙人間,雙人間)的元組。所以...,步驟1的結果被引導到步驟2,並且我們得到位置的實例作爲「讀取」的返回。

現在的寫道:

implicit val locationWrites: Writes[Location] = (
    (JsPath \ "lat").write[Double] and 
    (JsPath \ "long").write[Double] 
)(unlift(Location.unapply)) 

首先是 「不應用」。我在REPL嘗試:

scala> val heyDude = Location.unapply 
<console>:16: error: missing arguments for method unapply in object Location; 
follow this method with `_' if you want to treat it as a partially applied function 
    val heyDude = Location.unapply 

哎呀,好了,我也跟着指令:

scala> val heyDude = Location.unapply _ 
heyDude: Location => Option[(Double, Double)] = <function1> 

好了,我們得到了轉換位置的一個實例的(可選)元組的部分功能(雙人,雙人)。

接下來, 「unlift」:

scala> val hohoho = unlift(heyDude) 
hohoho: Location => (Double, Double) = <function1> 

scala> val loc = Location(1, 2) 
loc: Location = Location(1.0,2.0) 

scala> hohoho(loc) 
res16: (Double, Double) = (1.0,2.0) 

好了,所以...... unlift乾脆扔掉 「選項」,並直接把我們帶到了元組。

好...所以...我想...給定位置的一個實例時,這個「寫道:」寫操作... *),它將:

  1. 通行證,通過對象即unlift產生的部分函數(Location.unapply)。

  2. 由局部函數返回的元組(雙,雙)然後被引導到任何由該產生的:

    (JsPath \ 「LAT」)寫[雙]和 (JsPath \「長「)。寫[雙]

到底什麼是「無論」?繼JsPath的API文檔後,我認爲它是OWrites:https://www.playframework.com/documentation/2.3.x/api/scala/index.html#play.api.libs.json.OWrites

但是......我看不到在OWrites中有一個名爲「and」的方法。這個「和」在哪裏申報?它有什麼作用?是否:「oWrites1和oWrites2」產生「oWrites3」?而這個「oWrites3」是一種特殊類型的OWrites,它以元組作爲輸入? ...如果是這種情況...元組沒有關於case類中屬性名稱的信息(「lat」和「long」)。它如何知道生成的json字符串應該是{「lat」:1,「long」:2}呢?

對不起,列車問題。請幫助我清楚瞭解這一點。謝謝!

*)https://www.playframework.com/documentation/2.3.x/api/scala/index.html#play.api.libs.json.Writes


更新:

+0

這實質上是你在更新中鏈接的問題的重複。 '和'只是'〜'的別名。如果你仍然不確定的事情,也許可以修改你的問題到你不瞭解的鏈接答案部分? –

+0

謝謝。是的,我發佈我的問題後找到了鏈接。對搜索查詢進行了一些試驗以獲得這些結果,所以我把它放在這裏以便將來查找。 將關閉此問題。 –

回答

0

有疑問時,反編譯。這表明有一個隱含的toFunctionalBuilderOps,然後you can see in FunctionalBuilderOps那裏有你的and方法

+0

對於downvoter,爲什麼? –

+0

謝謝。我在鏈接的網址中找到了解釋。 –

相關問題