【问题标题】:Add Values to a Sequence?向序列添加值?
【发布时间】:2011-07-27 15:31:02
【问题描述】:

我在我的模板中创建了一个 FreeMarker sequence

<#assign x = ["red", 16, "blue", "cyan"]>

如何向序列中添加其他值?

【问题讨论】:

    标签: freemarker


    【解决方案1】:

    您必须通过连接x 和仅包含新元素的序列来创建一个新序列:

    <#assign x = x + [ "green" ] />
    

    【讨论】:

    • @Vicky SequenceModel 类具有 add 方法,但在调用它们的语法中不存在任何内容。所以我的解决方案是做到这一点的唯一方法(当然没有编写 Java 代码并将其添加到模型中)。
    • 是的,就模板语言而言,序列(和哈希)是不可变的。 SimpleSequence 只是序列实现之一,SimpleSequence.add 仅用于初始化 Java 中的序列。
    • 我最近遇到一个问题,x+["green"]&lt;#list&gt; for 3000 次 带来了性能问题,但是 ["green"] + x 解决了这个问题! 关于左手和右手。顺便说一句 @LaurentPireyn 的解决方案是另一种好方法。
    • 感谢@soytian 提出您的修复建议,它确实有效,我从 1 分钟的 1000 个“右手追加”(即:x+[“green”])到 20 秒的 1000 个“左手” -hand appends" (即:["green"]+x)
    【解决方案2】:

    FreeMarker 基本上是一种只写一次的语言。它非常努力地使操作数据变得不可能,包括修改数组或映射等。

    但是,您可以通过连接和重新分配来解决此问题:

    <#assign my_array = [] />
    <#list 1..10 as i>
      <#assign my_array = my_array + ["value " + i] />
    </#list>
    

    这将产生一个包含“值 1”到“值 10”的数组。如果这看起来不优雅,那是因为它是这样设计的。从 FreeMarker 的意识形态角度来看,一旦您开始构建数组等,您就已经超越了模板语言应该做的事情,而进入了模型、控制器、帮助类等在 Java 代码中应该做的事情。您越偏离这个观点,在 FreeMarker 中工作就会变得非常令人沮丧。

    来自http://freemarker.sourceforge.net/docs/app_faq.html#faq_modify_seq_and_map

    FreeMarkes 模板语言不支持修改序列/哈希。它用于显示已经计算的东西,而不是用于计算数据。保持模板简单。但不要放弃,您会在下面看到一些建议和技巧。

    【讨论】:

      【解决方案3】:

      Laurent's answer 是正确的并且完全可以接受。但您也可以使用速记添加值:

      <#assign x += ["green"]>
      

      现在序列将如下所示:

      Sequence (5)
        0 = "red" (String)
        1 = 16 (BigDecimal)
        2 = "blue" (String)
        3 = "cyan" (String)
        4 = "green" (String)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-18
        • 2012-08-26
        • 1970-01-01
        • 2017-12-09
        • 1970-01-01
        • 2019-06-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多