Scala Play框架FunctionalCanBuild详解

Scala Play framework FunctionalCanBuild explain

出于好奇,请学过Scala的同学解释一下FunctionalCanBuild的实现是什么鬼:

因此,可以在 play 框架中为 class 创建自定义 Json Writes,如下所示:

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

and 是在 FunctionalBuilderOps 和 returns FunctionalBuilder[M]#CanBuild2 中定义的方法 returns FunctionalBuilder[M]#CanBuild3 等等,直到 FunctionalBuilder[M]#CanBuild22.

为什么是 22?如果我的模型有 23 个字段怎么办? 从 Scala 的角度如何理解这一点:

fu.fmap[A1 ~ A2, B](canBuild(m1, m2), { case a1 ~ a2 => f(a1, a2) })

为什么 ~(以及定义的地方)调用泛型?

我知道,这个问题可能看起来有点复杂,但 Whosebug 是我唯一的希望,没有谷歌搜索没有 scala 文档有助于理解。

~ 定义在这里:https://github.com/playframework/play-json/blob/master/play-functional/src/main/scala/play/api/libs/functional/Products.scala#L9

A ~ B 就像一对 (A, B).

22 是 Scala 中的幻数:

Why are scala functions limited to 22 parameters?

https://underscore.io/blog/posts/2016/10/11/twenty-two.html