3

这是一个有点晦涩的问题,但是在 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 插值器中添加对它的支持

4

2 回答 2

6

无论您是否在字符串插值中工作,都没有任何区别。这实际上是字符串插值的重点:在一个代码块中,您可以使用该语言的所有功能和特性,就像它是任何其他块一样。

您应该以函数式风格编写此代码,您可以yieldfor循环中使用它,或者在列表中使用地图:

html"""<ul>
${
  for (todoItem <- todoList) yield html"""<li>TODO: $todoItem</li>"""
}
</ul>"""

html"""<ul>
${
  todoList.map{ todoItem => html"""<li> ODO: $todoItem</li>""" }
}
</ul>"""
于 2013-02-24T18:37:21.490 回答
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
于 2020-05-20T07:40:53.013 回答