Добавить значения в последовательность?

Я создал последовательность FreeMarker в своем шаблоне:

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

Как добавить дополнительные значения в последовательность?


person Vicky    schedule 01.04.2011    source источник


Ответы (3)


Вы должны создать новую последовательность, объединив x и последовательность, содержащую только новый элемент:

<#assign x = x + [ "green" ] />
person Laurent Pireyn    schedule 01.04.2011
comment
@Vicky Класс SequenceModel имеет методы add, но в синтаксисе ничего не существует для их вызова. Таким образом, мое решение - единственный способ сделать это (конечно, за исключением написания кода Java и добавления его в модель). - person Laurent Pireyn; 01.04.2011
comment
Да, последовательности (и хэши) неизменяемы с точки зрения языка шаблонов. SimpleSequence — это всего лишь одна из реализаций последовательности, а SimpleSequence.add предназначен только для инициализации последовательности в Java. - person ddekany; 10.01.2015
comment
В последнее время я столкнулся с проблемой, x+["green"] из <#list> 3000 раз вызвал проблему с производительностью, но ["green"] + x исправил эту проблему! Речь идет о левой и правой руках. Кстати, решение @LaurentPireyn - еще один хороший способ. - person soytian; 13.06.2018
comment
Спасибо @soytian за предложение вашего исправления, оно действительно работает, я перешел с 1 минуты на 1000 правых добавлений (т.е.: x+[зеленый]) до 20 секунд на 1000 левых добавлений (т.е.: [зеленый]+x) - person nicolas.leblanc; 04.03.2020

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 не поддерживает модификацию последовательностей/хэшей. Это для отображения уже рассчитанных вещей, а не для расчета данных. Держите шаблоны простыми. Но не сдавайтесь, ниже вы увидите несколько советов и хитростей.

person Jun-Dai Bates-Kobashigawa    schedule 19.01.2012

Ответ Лорана правильный и вполне приемлемый. Но вы также можете добавить значение, используя сокращенную запись:

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

Теперь последовательность будет выглядеть так:

Sequence (5)
  0 = "red" (String)
  1 = 16 (BigDecimal)
  2 = "blue" (String)
  3 = "cyan" (String)
  4 = "green" (String)
person Ryan Payne    schedule 20.08.2019