web-dev-qa-db-fra.com

Comment faire un si / autrement en ligne (aka opérateur ternaire) dans Velocity?

En Java pur, je pourrais faire ceci:

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

Alors que dans Velocity, la forme longue serait:

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

Existe-t-il une forme courte dans Velocity? Je veux pouvoir faire un si/autrement en ligne.

33
Michael

Tu peux faire

#set($value = "#if($flag)red#{else}blue#end")
46
aioobe

Vous n'avez pas besoin d'une directive #macro ou #set. La clé utilise des accolades pour la directive #else.

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

De doc (presque à la fin de la section Conditionals):

Encore une note utile. Lorsque vous souhaitez inclure du texte immédiatement après une directive #else, vous devrez utiliser des accolades entourant immédiatement la directive pour la différencier du texte suivant. (Toute directive peut être délimitée par des accolades, bien que ce soit plus utile pour #else).

[~ # ~] note [~ # ~] : Indépendamment de ce que dit le doc, j'ai depuis trouvé qu'il peut être nécessaire d'ajouter les accolades lors de l'utilisation d'une instruction if en ligne simple.

#if($includePrefix)Affected #{end}Inspection
18
KSev

Il existe également une approche avec macro réutilisable:

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

Ensuite

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

Notez que les documents sur la vitesse indiquent que l'utilisation de macros a un impact sur les performances.

7
Vadzim