StringTemplate 3: как отфильтровать список?

Как я могу удалить определенные элементы из списка (= многозначный атрибут) с помощью карты? Например, предположим, что я хочу отфильтровать все b в заданном списке:

<["a", "b", "c", "b"]: {<table.(it)>}; separator=",">
table ::= ["b":, default: key]

Желаемый результат будет "a,c", но фактический результат будет "a,,c,"
Дело в том, что карта успешно превращает b в нули, но затем они заворачиваются в анонимный шаблон {} и становятся ненулевыми значениями. Так что с функцией strip() они тоже никуда не денутся.

Итак, вопрос в том, можно ли отфильтровать список с помощью карты, немного изменив приведенный выше код?

обновить

Я нашел обходной путь:

filter(it) ::= "<if(it)><it><endif>"
<["a", "b", "c", "b"]: {<table.(it)>}: filter(); separator=",">

Это дает результат, который я хотел: a, c


person K J    schedule 13.11.2012    source источник


Ответы (1)


Возможно, вам не нужно фильтровать в вашем шаблоне, но, тем не менее, это может быть ошибкой.

Хорошо, я проверил это. Это дает пустое, а не нулевое значение, поэтому он думает, что это элемент. ST обрабатывает ложные условные выражения таким же образом: пусто, а не нуль. Я думаю, вам нужно фильтровать в модели.

person Terence Parr    schedule 13.11.2012
comment
Спасибо и извините за поздний ответ. Кстати, предложение ST treats false conditionals same way: empty not null иногда может быть неверным. Пожалуйста, взгляните на мой обновленный пост выше. - person K J; 25.01.2013