Как сделать встроенный оператор если/иначе (он же тернарный оператор) в Velocity?

На чистой Java я мог бы сделать так:

value = (a > b) ? a : b;

В то время как в Velocity длинная форма будет выглядеть так:

#if($a > $b)          
    #set($value = $a)
#else
    #set($value = $b)
#end

Есть ли в Velocity короткая форма? Я хочу иметь возможность сделать встроенный if / else.


person Michael    schedule 15.02.2011    source источник


Ответы (3)


Ты можешь сделать

#set($value = "#if($flag)red#{else}blue#end")
person aioobe    schedule 15.02.2011
comment
Я попробовал ваше решение, и оно сработало. Однако показалось странным, что для этого требуется директива #set. Итак, я просмотрел документацию по запросу #{else} и обнаружил, что концепция четко документирована — ее легко понять, но трудно заметить. - person KSev; 14.05.2014

Вам не нужна директива #macro или #set. Суть в использовании фигурных скобок для директивы #else.

#if($plural)were#{else}was#end

Из документа (почти в конце раздела "Условные обозначения") :

Еще одно полезное замечание. Если вы хотите включить текст сразу после директивы #else, вам нужно будет использовать фигурные скобки, окружающие директиву, чтобы отличить ее от следующего текста. (Любая директива может быть заключена в фигурные скобки, хотя это наиболее полезно для #else).

ПРИМЕЧАНИЕ. Независимо от того, что говорится в документе, я обнаружил, что при использовании простого встроенного оператора if может потребоваться добавить фигурные скобки.

#if($includePrefix)Affected #{end}Inspection
person KSev    schedule 13.05.2014
comment
Вы можете разделять директивы пробелами. - person Alex78191; 28.04.2018

Также есть подход с повторно используемым макросом:

#macro(iif $cond $then $else)#if($cond)$then#else$else#end#end

затем

#define ($value)
#iif("$a > $b", $a, "$b")
#end

Обратите внимание, что в документации по скорости указано, что использование макросов оказывает некоторое влияние на производительность.

person Vadzim    schedule 31.08.2012