元组和映射之间的关系是什么,可以作为 "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._1
、 res._2
访问姓名和年龄。
现在开始对您的映射函数进行说明。 mapping
函数采用另外两个函数 apply
和 unapply
。 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分别是String和Int类型。将它们连接后将其转换为 String
,unapply
接受字符串类型参数,returns 接受字符串和 Int 类型参数。即 apply
和 unapply
方法就像 A=>T
和 T=>A
一样。
有关表单的更多信息,请参阅 play framework 的文档。
有关 Mapping
特征的更多参考,源代码在这里。
https://github.com/playframework/playframework/blob/master/framework/src/play/src/main/scala/play/api/data/Form.scala
在 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._1
、 res._2
访问姓名和年龄。
现在开始对您的映射函数进行说明。 mapping
函数采用另外两个函数 apply
和 unapply
。 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分别是String和Int类型。将它们连接后将其转换为 String
,unapply
接受字符串类型参数,returns 接受字符串和 Int 类型参数。即 apply
和 unapply
方法就像 A=>T
和 T=>A
一样。
有关表单的更多信息,请参阅 play framework 的文档。
有关 Mapping
特征的更多参考,源代码在这里。
https://github.com/playframework/playframework/blob/master/framework/src/play/src/main/scala/play/api/data/Form.scala