我需要一种方法来找到FreeMarker中两个值的最小值,我尝试这样做,但它失败了:
<#function min a b>
<if a gt b>
<#return b />
<else>
<#return a />
</if>
</#function>
...
/* min#1 ${min(0.280617, 1.0)} */
/* min#2 ${min(1.0, 0.280617)} */
不是在两行都打印出0.280617,而是得到以下结果:
/* min#1 1 */
/* min#2 0.280617 */
为什么?我该怎么补救呢?
<if ...>
只是静态文本(因为它不以<#
或任何其他保留模式开始),并且函数忽略静态文本(它们不输出任何内容),因此您的函数刚刚返回第一个#return
,这是无条件运行的,因为<if ...>
只是静态文本。(非空白静态文本应该是一个错误,但这将是非常向后不兼容修复现在,在10多年后…也许在2.4中会有一个选项来修复这样的事情。)
还请注意,该函数可以用更简单的形式编写(需要2.3.23):
<#function min(a, b)>
<#return (a < b)?then(a, b)>
</#function>
抱怨。我只是不知道为什么……如果我使用<#if>
而不是<if>
,我曾经在函数结束时从Freemarker得到一个错误。现在它似乎可以工作了。
<#function min a b>
<#if a gt b>
<#return b />
<#else>
<#return a />
</#if>
</#function>