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