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

failed attempt to create a min(a,b) function in freemarker

我需要一种方法来找到 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> 而不是 <if>,我过去常常在函数末尾从 Freemarker 得到一个错误。现在好像没问题了。

<#function min a b>
  <#if a gt b>
    <#return b />
  <#else>
    <#return a />
  </#if>
</#function>

<if ...> 只是静态文本(因为它不以 <# 或任何其他保留模式开头),并且函数忽略静态文本(它们不输出任何内容),所以您函数刚刚在第一个 #return 无条件地返回,因为 <if ...> 只是静态文本。 (非空白静态文本应该是一个错误,但是在 10 多年之后现在修复它会非常向后不兼容......也许在 2.4 中会有一个选项来修复这样的事情。)

另请注意,函数可以写成更简单的形式(需要 2.3.23):

<#function min(a, b)>
  <#return (a < b)?then(a, b)>
</#function>