Scala/Play的语法和含义!代码示例

bal*_*teo 4 scala playframework

我有以下Scala/Play!码:

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

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

关于上面代码的语法和含义,我有几个问题:

  • 在什么类/对象上~调用的方法?
  • 参数的类/类型是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))
}
Run Code Online (Sandbox Code Playgroud)

sen*_*nia 8

一步步:

\对象JsPath的方法

val path1: JsPath = JsPath \ "from_user_name"
val path2: JsPath = JsPath \ "text"
Run Code Online (Sandbox Code Playgroud)

方法read上类型的对象JsPath

val reads1: Reads[String] = path1.read[String]
val reads2: Reads[String] = path2.read[String]
Run Code Online (Sandbox Code Playgroud)

没有方法~Reads,但在这样的方法FunctionalBuilderOps和存在的隐式转换从M[T]FunctionalBuilderOps[M[_], T]play.api.libs.functional.syntax- toFunctionalBuilderOps.

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

val canBuild2: CanBuild2[String, String] = reads1FunctionalBuilderOps.~(reads2)
Run Code Online (Sandbox Code Playgroud)

Tweet.apply _是一个scala语法,用于创建FunctionNN参数的using方法:

val func: (String, String) => Tweet = Tweet.apply _
Run Code Online (Sandbox Code Playgroud)

有一种apply方法CanBuild2[A, B].它接受(A, B) => C并返回Reads[C](在这种情况下):

implicit val tweetReads: Reads[Tweet] = canBuild2.apply(func)
Run Code Online (Sandbox Code Playgroud)

其实也存在隐含参数JsPath#read,toFunctionalBuilderOpsCanBuild2#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)
Run Code Online (Sandbox Code Playgroud)