元组和映射之间的关系是什么,可以作为 "object Form" 的参数给出

What is the relation between tuple and mapping which can be given as argument into "object Form"

在 scala play 中,可以创建一个表单:

val userForm = Form(
  mapping(
    "name" -> text,
    "age" -> number
  )(User.apply)(User.unapply)
)

或:

val loginForm = Form(
  tuple(
    "email" -> text,
    "password" -> text
  )
)

我在 github 中深入研究了 Form.scala。使这些成为可能的代码如下:

object Form {
/**
* Creates a new form from a mapping.
*
* For example:
* {{{
* import play.api.data._
* import play.api.data.Forms._
* import play.api.data.format.Formats._
*
* val userForm = Form(
* tuple(
* "name" -> of[String],
* "age" -> of[Int],
* "email" -> of[String]
* )
* )
* }}}
*
* @param mapping the form mapping
* @return a form definition
*/
def apply[T](mapping: Mapping[T]): Form[T] = Form(mapping, Map.empty, Nil, None)

我的问题是:

1-什么是mapping?我找不到它了。我想它应该是 object mapping 或至少 case class mapping 之类的东西?我在源代码中找不到它。

2- 我也不明白mapping() 之后添加(User.apply)(User.unapply) 的部分。据说他们要构建和解构 Form。不过我不太明白。

3- 如何使用元组代替 Mapping?在api中,我根本找不到任何相关线索。

谢谢。

play 形式的元组是 scala 中的简单元组,而映射可以让你将你的形式映射到你自己的类型,比如 case class,一个例子可以是。

case class User(name:String,age:Int)

如果你想将你的表单映射到大小写 class 那么你可以这样做,

val userForm = Form(
  mapping(
    "name" -> text,
    "age" -> number
  )(User.apply)(User.unapply)
)

然后您可以通过

直接将您的案例class用户绑定到您的表单数据
 val res = request.bindFormRequest.get

此处 res 将是 User 类型或 User class

的实例

但是您可以简单地使用元组,例如,

val userForm = Form(
  tuple(
    "email" -> text,
    "password" -> text
  )
)

得到结果如下

 val res = request.bindFormRequest.get

此处 res 将是 (String,Int) 类型,您可以通过 res._1res._2 访问姓名和年龄。

现在开始对您的映射函数进行说明。 mapping 函数采用另外两个函数 applyunapplyapplyunapply 方法用于将一种形式转换为另一种形式。例如:

 object User {
    def apply(name: String, age: Int) = {
      name + "," + age.toString
    }

    def unapply(nameAndAge: String) = {
      val r = nameAndAge.split(",")
      (r.head, r.last)
    }
  }

  println(User("curious", 23))

  println(User.unApply("curious,23"))

这里,apply方法有两个参数name和age分别是String和Int类型。将它们连接后将其转换为 Stringunapply 接受字符串类型参数,returns 接受字符串和 Int 类型参数。即 applyunapply 方法就像 A=>TT=>A 一样。

有关表单的更多信息,请参阅 play framework 的文档。 有关 Mapping 特征的更多参考,源代码在这里。 https://github.com/playframework/playframework/blob/master/framework/src/play/src/main/scala/play/api/data/Form.scala