这是一个模糊的问题,但是在Scala的字符串插值中循环的最佳方法是什么?例如,如果你想这样做
html"""<ul>
${
for (todoItem <- todoList) {
html"""<li>TODO: ${todoItem}</li>"""
}
}
</ul>"""
我没有看到累积内部html类的简洁方法,因此字符串插值器可以使用它。我唯一能想到的是
html"""<ul>
${
var htmlList=List.empty[Html]
for (todoItem <- todoList) {
htmlList :+ html"""<li>TODO: ${todoItem}</li>"""
}
htmlList
}
</ul>"""
并在我的自定义html插值器中添加其他支持
答案 0 :(得分:4)
无论您是否在字符串插值中工作,都没有任何区别。这实际上是字符串插值的要点:在代码块中,您可以使用该语言的所有功能和特性,就像它是任何其他块一样。
您应该以功能样式编写此功能,您可以使用yield
循环中的for
或列表中的地图来执行此操作:
html"""<ul>
${
for (todoItem <- todoList) yield html"""<li>TODO: $todoItem</li>"""
}
</ul>"""
html"""<ul>
${
todoList.map{ todoItem => html"""<li> ODO: $todoItem</li>""" }
}
</ul>"""
答案 1 :(得分:0)
具有字符串输出的样本,该样本最多从列表的顶部获取3个元素。 @ rex-kerr的答案是正确的,但是他正在生成html元素。在我的示例中,我正在生成文本作为输出。至关重要的想法是mkString
的呼吁。
val ids = List(1,4,6,7,8,99,42)
val r = s"""
|<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:sk="sk:asdf:fuse:osr:soap:type" xmlns:sk1="sk:fdsa:fuse:ode:commontypes:soap:type">
| <soap:Header/>
| <soap:Body>
| <sk:GetSomeEntityRequest>
| <sk1:MessageHeader>
| <sk1:Uuid>1</sk1:Uuid>
| </sk1:MessageHeader>
| <sk:SomeEntityList>
| ${(for(singleId <- ids.take(3)) yield {s"<sk:entityId>${singleId}</sk:entityId>"}).mkString("\n")}
| </sk:SomeEntityList>
| </sk:GetSomeENtityRequest>
| </soap:Body>
|</soap:Envelope>
|""".stripMargin