2014-01-08 21 views
4

我有以下內容Scala/Play!代碼:Scala/Play的語法和含義!代碼示例

case class Tweet(from: String, text: String) 

implicit val tweetReads = (
(JsPath \ "from_user_name").read[String] ~ 
(JsPath \ "text").read[String]) (Tweet.apply _) 

關於上面的代碼的語法和意義幾個問題:

  • 在什麼類/對象是~方法調用呢?
  • Tweet.apply參數的類別/類型是什麼?

編輯1:完整的源代碼:

package models 

import play.api.libs.json._ 
import play.api.libs.json.util._ 
import play.api.libs.json.Reads._ 
import play.api.libs.json.Writes._ 
import play.api.libs.functional.syntax._ 

case class Tweet(from: String, text: String) 

object Tweet { 

    implicit val tweetReads = (
     (JsPath \ "from_user_name").read[String] ~ 
     (JsPath \ "text").read[String])(Tweet.apply _) 

    implicit val tweetWrites = (
    (JsPath \ "from").write[String] ~ 
    (JsPath \ "text").write[String])(unlift(Tweet.unapply)) 
} 
+0

請添加'play'版本並導入。 – senia

+0

我使用Play! 2.2.1。我已經使用該模型的完整源代碼更新了我的文章。 – balteo

回答

8

一步一步:

上對象的方法\ JsPath

val path1: JsPath = JsPath \ "from_user_name" 
val path2: JsPath = JsPath \ "text" 

JsPath

類型的對象的方法 read
val reads1: Reads[String] = path1.read[String] 
val reads2: Reads[String] = path2.read[String] 

沒有方法~Reads,但在這樣的FunctionalBuilderOps方法和存在的隱式轉換從M[T]play.api.libs.functional.syntaxFunctionalBuilderOps[M[_], T] - toFunctionalBuilderOps

val reads1FunctionalBuilderOps: FunctionalBuilderOps[Reads, String] = 
    toFunctionalBuilderOps(reads1) 

val canBuild2: CanBuild2[String, String] = reads1FunctionalBuilderOps.~(reads2) 

Tweet.apply _是一個階語法來創建FunctionN使用方法與N參數:

val func: (String, String) => Tweet = Tweet.apply _ 

有一個在一個CanBuild2[A, B]方法apply。它接受(A, B) => C並返回Reads[C](在這種情況下):

implicit val tweetReads: Reads[Tweet] = canBuild2.apply(func) 

其實也存在於JsPath#readtoFunctionalBuilderOpsCanBuild2#apply方法隱含參數。使用該參數:

val reads1: Reads[String] = path1.read[String](Reads.StringReads) 

... 
val reads1FunctionalBuilderOps: FunctionalBuilderOps[Reads, String] = 
    toFunctionalBuilderOps(reads1)(
    functionalCanBuildApplicative(
     Reads.applicative(JsResult.applicativeJsResult))) 

... 
implicit val tweetReads: Reads[Tweet] = 
    canBuild2.apply(func)(functorReads) 
+0

Hi Senia!感謝您的詳細回覆。我正在研究你的回覆。我會提出問題。忍受着我...... – balteo

+0

你能否確認'Tweet.apply _'是一個應用的調用?另外'_'佔位符是什麼意思? – balteo

+0

我很困惑這個'Tweet.apply _' ...爲什麼只有一個參數適用(即我。即_)? – balteo

2

我只是補充說這被稱爲應用語法(適用於函數函數)。例如可以看到scala parser combinator library

如果你想知道如何使用它與json嘗試閱讀this。播放框架中的應用仿函數的另一個例子是form handling。或者你可以嘗試閱讀關於Scalaz驗證。