??之间的区别 ,has_content,if_exists存在于freemarker中


73

freemarker中的以下内容有什么区别?

!
has_content
?? 
if_exists

我用了 ??而不是has_content,它会导致如此巨大的问题。搞砸了我的一天。我真的需要弄清楚这件事。

当我使用

!(xyz.abc!)?? -- it dint work

当我使用

!(xyz.abc!)?has_content ... it did work 

不是吗?或has_content或if_exists检查同一件事?


Answers:


166

??告诉左操作数的值是否丢失(意味着它是Javanull或您那里有未定义的变量),并相应地返回false(丢失)或true(不丢失)。

?has_content类似于??,不同之处在于它还会返回false长度为0的字符串或空的FTL序列(如java.util.ListJava数组等)或空的FTL哈希(如java.util.Map等等)。(不退还false0,布尔false等)

!用于在缺少值(再次表示它是Javanull或您有未定义的变量)时提供默认值,例如color!"no color"。如果省略右手操作的!,则默认值是一个空字符串和空序列和空散列在同一时间(多输入值),这是非常方便的书写之类的东西<#list things! as thing>${foo!}

?if_exists是旧的写作方式??。不要使用它。

当我们在这里时,请注意所有这些运算符仅覆盖点或[]表达式的最后一步,就像user.price!0仅处理,如果price缺少user,则处理,而如果user本身缺失则不进行处理。为了涵盖这两种可能性,请使用(user.price)!0,它处理在评估时抛出的所有遗漏的变量错误(),而不管它们来自何处。


24
“有据可查”的语句值得提供一些链接:) has_content默认值运算符!缺少价值测试??老式的if_exists
coolersport 2015年

1
?has_content是有用的,除非值是BooleanNumber 1/0 for yes/no
大豆

如果这个买家不在那里,<#elseif buyer.company?has_content >就会给别人一个不确定的答案:如何检查买家是否存在我在以上的一切尝试了!
shareef

1
@shareef如果只能buyer丢失,但如果company一直存在,则始终存在,则为<#elseif buyer??>,否则为<#elseif (buyer.company)??><#elseif (buyer.company)?has_content>。在()使存在处理运营商覆盖整个表达式。
ddekany
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.