val form = Form(mapping("name" -> nonEmptyText,"price" -> number(min = 0))(Data.apply)(Data.unapply))

分享 未结
0 0 1 161
Play2019 2020-06-01发布
收藏 点赞

package controllers

object WidgetForm {

 import play.api.data.Forms._

   import play.api.data.Form

case class Data(nameStringpriceInt)

val form = Form(mapping("name" -> nonEmptyText,"price" -> number(min = 0))(Data.apply)(Data.unapply)) }

最后一个语句,这里Form是一个方法?Form这个方法又接收mapping方法?(Data.apply)(Data.unapply)这两个字段是Form的柯里化?可以这样理解么?然后为什么调用apply方法还要调用unapply方法?这是啥意思?

回帖
  • 2020-06-04

    看下Form.apply和Forms.mapping两个方法声明就清楚了:

    // Form.apply方法声明
    def apply[T](mapping: Mapping[T]): Form[T] = Form(mapping, Map.empty, Nil, None)
    
    // Forms.mapping方法声明
    def mapping[R, A1, A2](a1: (String, Mapping[A1]), a2: (String, Mapping[A2]))(apply: Function2[A1, A2, R])(unapply: Function1[R, Option[(A1, A2)]])
    
    • 由于Form是Object,所以Form.apply(...)调用可以简写成Form(...)。
    • Forms.mapping方法接受三组参数,第一组是mapping定义部分,第二组和第三组是两个一元函数,作用是处理 case class 和 tuple之间的序列化和反序列化。


    0