在scala的字符串插值中循环

时间:2013-02-24 17:50:13

标签: scala scala-2.10 string-interpolation

这是一个模糊的问题,但是在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插值器中添加其他支持

2 个答案:

答案 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