arithmetic - Diferencia entre ??,has_content, if_existes en freemarker
freemarker module (1)
??
indica si falta el valor del operando de la izquierda (significa que es Java null
o si tiene una variable no definida allí), y devuelve false
(faltante) o true
(no faltante) en consecuencia.
?has_content
es muy parecido a ??
, excepto que también devuelve false
para una cadena de longitud 0 o una secuencia FTL vacía (como java.util.List
, matriz de Java, etc.) o hash FTL vacío (como java.util.Map
, etc.). (No devuelve false
para un 0
, false
booleano, etc.)
!
se utiliza para dar un valor predeterminado cuando falta un valor (de nuevo significa que es Java null
o que tiene una variable no definida), como el color!"no color"
. Si omites el operando de la mano derecha de !
, entonces el valor predeterminado es una cadena vacía y una secuencia vacía y un hash vacío al mismo tiempo (un valor de tipo múltiple), lo cual es útil para escribir cosas como <#list things! as thing>
<#list things! as thing>
, ${foo!}
.
?if_exists
es la vieja forma de escribir ??
. No lo uses
Mientras estamos aquí, tenga en cuenta que todos estos operadores solo cubren el último paso de una expresión punteada o []
, como user.price!0
solo se maneja si falta el price
del user
, pero no si falta el user
. Para cubrir ambas posibilidades, use (user.price)!0
, que maneja todos los errores de variables faltantes lanzados durante la evaluación del ()
, sin importar de dónde provengan.
¿Cuál es la diferencia entre los siguientes en freemarker?
!
has_content
??
if_exists
Solía ?? En lugar de has_content y que lleva a grandes problemas. Arruiné mi día. Realmente necesito aclarar esto.
Cuando utilicé
!(xyz.abc!)?? -- it dint work
Cuando utilicé
!(xyz.abc!)?has_content ... it did work
No ?? O has_content O if_existes comprueba lo mismo?