web-dev-qa-db-fra.com

Différence entre ?? , has_content, if_exists dans freemarker

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?)

57
user3606002

?? 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.

127
ddekany