在freemarker中创建min(a,b)函数失败



我需要一种方法来找到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>

最新更新