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

文字列補間内で作業しているかどうかに関係なく、違いはありません。これが実際には文字列補間のポイントです。コードブロック内には、他のブロックと同じように、言語のすべての機能と機能を利用できます。

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>"""
于 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 に答える