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)
一步步:
\对象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语法,用于创建FunctionN带N参数的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,toFunctionalBuilderOps和CanBuild2#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)