quelle est la différence entre ce qui suit dans freemarker?
!
has_content
??
if_exists
J'ai utilisé ?? au lieu de has_content & cela conduit à de tels problèmes énormes. Bousillé ma journée. J'ai vraiment besoin que cette chose soit clarifiée.
Quand j'ai utilisé
!(xyz.abc!)?? -- it dint work
Quand j'ai utilisé
!(xyz.abc!)?has_content ... it did work
N'est-ce pas ?? OR has_content OR if_exists vérifie la même chose?)
??
indique si la valeur de l'opérande de gauche est manquante (c'est-à-dire Java null
ou si vous avez une variable non définie ici)), et restitue false
(manquant ) ou true
(non manquant) en conséquence.
?has_content
ressemble beaucoup à ??
, sauf qu'il renvoie également false
pour une chaîne de longueur 0 ou une séquence FTL vide (comme Java.util.List
, Java, etc.) ou un hachage FTL vide (comme Java.util.Map
, etc.). (Il ne retourne pas false
pour un 0
, booléen false
, etc.)
!
est utilisé pour donner une valeur par défaut lorsqu'une valeur est manquante (cela signifie à nouveau que c'est Java null
ou que vous avez une variable non définie)), comme color!"no color"
. Si vous omettez l'opérande de droite de !
, alors la valeur par défaut est une chaîne vide, une séquence vide et un hachage vide en même temps (une valeur multi-typée), ce qui est pratique pour écrire des choses comme <#list things! as thing>
, ${foo!}
.
?if_exists
est l'ancienne manière d'écrire ??
. Ne l'utilisez pas.
Pendant que nous sommes ici, notez que tous ces opérateurs ne couvrent que la dernière étape d’un pointillé ou []
expression, comme user.price!0
gère uniquement si price
est absent de user
, mais pas si user
lui-même est manquant. Pour couvrir les deux possibilités, utilisez (user.price)!0
, qui gère toutes les erreurs de variable manquantes générées lors de l’évaluation du ()
, peu importe d'où ils viennent.