Ответ 1
Вы можете сделать
#set($value = "#if($flag)red#{else}blue#end")
В чистой Java я мог бы сделать это:
value = (a > b) ? a : b;
В то время как в Velocity длинная форма:
#if($a > $b)
#set($value = $a)
#else
#set($value = $b)
#end
Есть ли короткая форма в Velocity? Я хочу иметь возможность сделать if/else inline.
Вы можете сделать
#set($value = "#if($flag)red#{else}blue#end")
Вам не нужна директива #macro или #set. Ключ использует фигурные скобки для директивы #else.
#if($plural)were#{else}was#end
Из doc (почти в конце раздела "Условные" ):
Еще одно полезное замечание. Если вы хотите включить текст сразу же после директивы #else, вам нужно будет использовать фигурные скобки, непосредственно связанные с директивой, чтобы отличить его от следующего текста. (Любая директива может быть ограничена фигурными скобками, хотя это наиболее полезно для #else).
ПРИМЕЧАНИЕ. Независимо от того, что говорит документ, я обнаружил, что при использовании простого оператора inline if может потребоваться добавить фигурные скобки.
#if($includePrefix)Affected #{end}Inspection
Существует также подход с многократным макросом:
#macro(iif $cond $then $else)#if($cond)$then#else$else#end#end
Тогда
#define ($value)
#iif("$a > $b", $a, "$b")
#end
Обратите внимание, что в документах скорости указано, что использование макросов влияет на производительность.