Scala @在PlayFramework中重复helper.repeat

Scala @在PlayFramework中重复helper.repeat,scala,playframework,playframework-2.2,Scala,Playframework,Playframework 2.2,我不明白如何描述@helper。在play2.2.1中重复 @helper.form(action = routes.Application.send) { @helper.repeat( field = form1("input"), min = 3 ) {fld => @helper.inputText( field = fld, '_label ->"input" ) } } 这

我不明白如何描述
@helper
。在play2.2.1中重复

@helper.form(action = routes.Application.send) {

    @helper.repeat(
        field = form1("input"), min = 3
    ) {fld =>
        @helper.inputText(
            field = fld, '_label ->"input"
        )
    }
}
这是我无法理解的部分
fld=>@helper.inputText(field=fld)
。 这是什么意思? 我知道Java,所以我假设它是函数式编写,但是在上面的代码中,变量
fld
来自哪里? 为什么箭头尖端指示
@helper.inputText(field=fld)
? 为什么
fld
@helper.inputText
中字段的值? 我在谷歌上搜索过,但对于初学者来说,我找不到足够的解释。 我不确定斯卡拉的语法。 请为初学者解释以上代码?

原始答案 这似乎有点过于复杂了。不需要手动赋值。通常,您会编写一个如下的中继器:

@helper.repeat(form1("input"), min = 3) { fld =>
  @helper.inputText(fld, '_label ->"input")
}
def repeat(field: Field, min: Int)(fieldRenderer: (fld: Field) => Html): Seq[Html] {
  val list: List[Field] = field.getFields

  var output: List[Html] = List()
  for (i = 0; i < list.length; i++) {
    val element: Field = list.get(i)
    val html: Html = fieldRenderer(element)
    output += html
  }

  return output
}
在函数式编程中,这就是所谓的。您可能知道其他scala内置的高阶函数,如
map
filter
foreach
@helper.repeat
与foreach非常相似<代码>表单1(“输入”)指的是要显示的值的集合
min=1
告诉中继器至少显示一个字段。最后,在
{fld=>…}
中,迭代集合中定义的所有值

换句话说:
{fld=>…}
只是一个匿名函数,它接受一个
字段
参数(
fld
),并显示该特定字段的文本输入

跟进 好的,我试着从评论中跟进你的问题。让我们从
助手的签名开始。重复
。这里没有魔法,它只是一个普通的Scala函数:

helper.repeat(field: Field, min: Int)(fieldRenderer: (fld: Field) => Html): Seq[Html]
在Scala中,函数可以有多个参数列表。这里有两个。第一个参数列表包含两个参数:
字段
min
。第二个参数列表采用单个函数作为参数:
fieldRenderer
fieldRenderer
本身再次获取单个参数(
fld
)并返回
Html

重要的是,您传递的不是“数据”,而是一个函数。要澄清这一点:

签名
fieldRenderer:(fld:Field)=>Html

等于
def fieldRenderer(fld:Field):Html

这意味着,您可以在此函数中执行任何操作,只要它返回Html。这正是在最上面的示例中发生的情况。传递一个
字段
并返回
Html
。您可以通过调用
@helper.inputText
来实现这一点

现在,
repeat
首先从作为第一个参数传递的
字段中获取一个
列表[字段]
。此列表对应于容器类的字符串列表。另外,
repeat
确保该列表中至少有一个元素。这是因为您将
1
作为
min
传递。然后将函数
fieldRenderer
应用于列表中的所有元素

repeat
的伪代码实现可能如下所示:

@helper.repeat(form1("input"), min = 3) { fld =>
  @helper.inputText(fld, '_label ->"input")
}
def repeat(field: Field, min: Int)(fieldRenderer: (fld: Field) => Html): Seq[Html] {
  val list: List[Field] = field.getFields

  var output: List[Html] = List()
  for (i = 0; i < list.length; i++) {
    val element: Field = list.get(i)
    val html: Html = fieldRenderer(element)
    output += html
  }

  return output
}
def repeat(field:field,min:Int)(fieldRenderer:(fld:field)=>Html):Seq[Html]{
val list:list[Field]=Field.getFields
变量输出:List[Html]=List()
对于(i=0;i
原始答案 这似乎有点过于复杂了。不需要手动赋值。通常,您会编写一个如下的中继器:

@helper.repeat(form1("input"), min = 3) { fld =>
  @helper.inputText(fld, '_label ->"input")
}
def repeat(field: Field, min: Int)(fieldRenderer: (fld: Field) => Html): Seq[Html] {
  val list: List[Field] = field.getFields

  var output: List[Html] = List()
  for (i = 0; i < list.length; i++) {
    val element: Field = list.get(i)
    val html: Html = fieldRenderer(element)
    output += html
  }

  return output
}
在函数式编程中,这就是所谓的。您可能知道其他scala内置的高阶函数,如
map
filter
foreach
@helper.repeat
与foreach
非常相似<代码>表单1(“输入”)
指的是要显示的值的集合
min=1
告诉中继器至少显示一个字段。最后,在
{fld=>…}
中,迭代集合中定义的所有值

换句话说:
{fld=>…}
只是一个匿名函数,它接受一个
字段
参数(
fld
),并显示该特定字段的文本输入

跟进 好的,我试着从评论中跟进你的问题。让我们从
助手的签名开始。重复
。这里没有魔法,它只是一个普通的Scala函数:

helper.repeat(field: Field, min: Int)(fieldRenderer: (fld: Field) => Html): Seq[Html]
在Scala中,函数可以有多个参数列表。这里有两个。第一个参数列表包含两个参数:
字段
min
。第二个参数列表采用单个函数作为参数:
fieldRenderer
fieldRenderer
本身再次获取单个参数(
fld
)并返回
Html

重要的是,您传递的不是“数据”,而是一个函数。要澄清这一点:

签名
fieldRenderer:(fld:Field)=>Html

等于
def fieldRenderer(fld:Field):Html

这意味着,您可以在此函数中执行任何操作,只要它返回Html。这正是在最上面的示例中发生的情况。传递一个
字段
并返回
Html
。您可以通过调用
@helper.inputText
来实现这一点

现在,
repeat
首先从作为第一个参数传递的
字段中获取一个
列表[字段]
。此列表对应于容器类的字符串列表。另外,
repeat
确保该列表中至少有一个元素。这是因为您将
1
作为
min
传递。然后将函数
fieldRenderer
应用于列表中的所有元素

repeat
的伪代码实现可能如下所示:

@helper.repeat(form1("input"), min = 3) { fld =>
  @helper.inputText(fld, '_label ->"input")
}
def repeat(field: Field, min: Int)(fieldRenderer: (fld: Field) => Html): Seq[Html] {
  val list: List[Field] = field.getFields

  var output: List[Html] = List()
  for (i = 0; i < list.length; i++) {
    val element: Field = list.get(i)
    val html: Html = fieldRenderer(element)
    output += html
  }

  return output
}
def repeat(field:field,min:Int)(fieldRenderer:(fld:field)=>Html):Seq[Html]{
val list:list[Field]=Field.getFields