在 Scala 的字符串插值中循环

use*_*970 3 scala string-interpolation scala-2.10

这是一个有点晦涩的问题,但是在 Scala 的字符串插值中循环的最佳方法是什么?例如,如果你想这样做

  html"""<ul>
  ${
    for (todoItem <- todoList) {
      html"""<li>TODO: ${todoItem}</li>"""
    }
  }
  </ul>"""
Run Code Online (Sandbox Code Playgroud)

我看不到累积内部 html 类的简洁方法,以便字符串插值器可以使用它。我唯一能想到的是

  html"""<ul>
  ${
    var htmlList=List.empty[Html]
    for (todoItem <- todoList) {
      htmlList :+ html"""<li>TODO: ${todoItem}</li>"""
    }
    htmlList
  }
  </ul>"""
Run Code Online (Sandbox Code Playgroud)

并在我的自定义 html 插值器中添加对它的支持

Rex*_*err 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>"""
Run Code Online (Sandbox Code Playgroud)