Scala 元组和映射之间的关系是什么?可以将元组和映射作为参数提供给";“对象形式”;

Scala 元组和映射之间的关系是什么?可以将元组和映射作为参数提供给";“对象形式”;,scala,playframework-2.0,Scala,Playframework 2.0,在scala play中,可以按以下方式创建表单: val userForm = Form( mapping( "name" -> text, "age" -> number )(User.apply)(User.unapply) ) 或: 我在github中深入研究了Form.scala。使这些成为可能的代码如下: object Form { /** * Creates a new form from a mapping. * * For example:

在scala play中,可以按以下方式创建表单:

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

我在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-什么是
映射
?我找不到它。我想它应该类似于
对象映射
,或者至少是
案例类映射
?我在源代码中找不到它

2-我也不理解
mapping()
之后的部分,其中添加了
(User.apply)(User.unapply)
。据说他们是在建构和解构形式。不过我不太明白

3-如何使用元组来代替
映射
?在api中,我根本找不到它们相关的任何线索


谢谢。

播放表单中的元组是scala中的简单元组,而映射允许您将表单映射到自己的类型(如case类)中,这方面的示例如下

case class User(name:String,age:Int)
如果您想将表单映射到case类,那么可以这样做

val userForm = Form(
  mapping(
    "name" -> text,
    "age" -> number
  )(User.apply)(User.unapply)
)
然后,您可以通过以下方式将案例类用户直接绑定到表单数据:

 val res = request.bindFormRequest.get
这里的
res
将属于
User
类型或
User
类的实例

但是你可以简单地用tuple来表示

val userForm = Form(
  tuple(
    "email" -> text,
    "password" -> text
  )
)
并得到如下结果

 val res = request.bindFormRequest.get
这里的
res
类型为
(String,Int)
,您可以通过
res.\u 1
res.\u 2
分别访问姓名和年龄

现在,我们来解释一下映射函数<代码>映射函数接受另外两个函数
应用
不应用
apply
unapply
方法用于将一种表单转换为另一种表单。例如:

 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 of String和Int type resp。将它们串联后将其转换为
字符串
,并且
不应用
获取字符串类型参数并返回字符串和Int类型参数。i、 e
apply
unapply
方法类似于,
A=>T
T=>A
resp

有关表单的更多信息,请参阅play framework的文档。 有关
映射
trait的更多参考信息,请参阅此处的源代码。

play.api.data.Forms模块中的Object
Forms
有这些方法
映射
元组
?映射作为参数提供,以形成对象的apply方法。你所说的与这个话题无关。我错了吗?另外,尽管仍然不相关,表单并没有名为tuple的方法。什么是“形式”?你是说“表单”吗?我在api中找到表单。但他们似乎没有关系,是吗?@ShyamendraSolanki你说得对。我现在明白了。对不起,谢谢:)谢谢。我理解为什么我们要给出构造函数和解构器。但我不明白映射是什么,函数映射返回的是我们可以将User.apply作为参数的函数。编辑以解释apply和unapply方法,请看一看。正如您在我的问题中所看到的,这里我们使用对象形式。对象窗体的apply方法将映射特性作为参数。然而,我们使用的是一种叫做“映射”的东西。可能是个物体。这是哪里?它返回什么样的函数,它将函数作为参数接收?你所说的一切,我都已经知道了。我想我很难解释我自己。你在告诉我教程已经做了什么。“映射”在哪里?最重要的是,什么是“映射”?注意这里:不是“映射”,而是“映射”。你可以看看这里定义的所有函数,还有“映射”:aaaaaaaah,现在我明白了。在教程中,它们将表单对象中的所有内容添加为帮助器方法。非常感谢。我真傻。
 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"))