方法映射的参数太多:(apply:(String,String,String)=> R)(unapply:R => Option [(String,String,String)])play.api.data.Mapping [R]

时间:2013-09-24 13:15:50

标签: scala play2-mini

val computerForm = Form(
    mapping(
        "id" -> ignored(NotAssigned:Pk[Long]),
        "name" -> nonEmptyText,
        "introduced" -> optional(date("yyyy-MM-dd")),
        "discontinued" -> optional(date("yyyy-MM-dd")),
        "company" -> optional(longNumber)
    )(Computer.apply)(Computer.unapply)
)

这段代码给出了错误的方法映射参数:

(apply: (String, String, String) => R)(unapply: R => Option[(String, String, String)])play.api.data.Mapping[R]..please solve this issue"

1 个答案:

答案 0 :(得分:1)

让我们从Play2 Scaladoc开始吧。您调用的Form方法是Form.apply

Form scaladoc

def apply[T](mapping: (String, Mapping[T])): Form[T]

所以你的映射(smth)应该返回(String,Mapping[T])。相反,映射方法在对象Forms

中定义

Forms Scaladoc

Forms.mapping是一个带有多个可用签名的重载方法,让我们来看一个

def
mapping[R, A1, A2, A3, A4](a1: (String, Mapping[A1]), a2: (String, Mapping[A2]), a3: (String, Mapping[A3]), a4: (String, Mapping[A4]))(apply: (A1, A2, A3, A4) ⇒ R)(unapply: (R) ⇒ Option[(A1, A2, A3, A4)]): Mapping[R]

因此,此方法采用类型为(a1,a2,a3,a4)的第一个参数列表(String,Mapping[Aindex]),另一个包含单个参数apply: (A1, A2, A3, A4) ⇒ R的参数列表,以及包含单个参数的最后一个参数列表unapply: (R) ⇒ Option[(A1, A2, A3, A4)]

通常,对于所有重载版本的映射,签名强制使得apply / unapply应该具有对应于第一个参数列表的 tupled 版本的签名。

这里发生了什么,是通过->您正在创建 5 (String,Mappings[Asomething])元组,而您的apply/unapply只有 3 参数