【问题标题】:looping within scala's string interpolation在 scala 的字符串插值中循环
【发布时间】:2013-02-09 20:49:55
【问题描述】:

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

【问题讨论】:

    标签: scala scala-2.10 string-interpolation


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      字符串输出示例,最多从列表顶部获取 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-26
        • 2014-10-03
        • 1970-01-01
        相关资源
        最近更新 更多