类型独立的内置

这些是内置的,根本不关心其左手参数的类型。

switch

Note:

此内置功能自 FreeMarker 2.3.23 开始存在。

这基本上是switch-case-default directives的嵌入式(表达式)版本。它的通用格式类似于matchedValue?switch(case1, result1, case2, result2, ... caseN, resultN, defaultResult),其中defaultResult可以省略。例:

<#list ['r', 'w', 'x', 's'] as flag>
  ${flag?switch('r', 'readable', 'w' 'writable', 'x', 'executable', 'unknown flag: ' + flag)}
</#list>
readable
  writable
  executable
  unknown flag: s

也就是说,switch将找到第一个case参数(从左到右),其值等于matchedValue,然后返回result参数的值,该值紧接在case参数之后。如果找不到相等的case,则它将返回defaultResult的值,或者如果没有defaultResult参数(即,参数的数量为偶数),则它将停止模板处理,并显示错误。

Further details:

  • matchedValuecase参数值的比较的行为与==运算符完全相同。因此,它仅比较标量和仅相同类型的值。因此,像x?switch(1, "r1", "c2", "r2")这样的东西是没有意义的,好像x是非数字的,则第一种情况将导致错误,而如果x是数字的,则第二种情况将导致错误(除非x1,否则我们将不会在第一个之后进行进一步比较)。

  • 与普通方法调用不同,仅评估确实需要的switch(...)参数。例如,在two()?switch(c1(), r1(), c2(), r2(), c3(), r3())中,如果two()返回2c1()返回1,并且c2()返回2,则仅将调用以下函数,并按此 Sequences:m()c1()c2()r2()。 (自然地,未求值的参数可以引用丢失的变量而不会导致错误.)可以保证case参数表达式从左到右求值,直到找到第一个匹配项。还可以确保仅对属于第一个匹配caseresult表达式进行求值。还保证只有在没有匹配的case参数时才对defaultResult表达式求值。

  • case参数表达式不必是常量值,它们可以是任意复杂的表达式。当然,resultdefaultResultmatchedValue也是一样。

  • case参数值的类型没有任何限制,例如它们可以是字符串,数字,日期等。但是,由于==运算符的工作方式,在内部使用不同类型的case参数没有意义相同 switch(请参见前面的原因)。

  • case directive不同,那里没有掉线行为,也就是说,不需要等效的break指令。

Note:

如果需要按布尔值进行切换,则应改用then built-in,例如matchedBoolean?then(whenTrue, whenFalse)

Note:

如果您需要执行任意逻辑测试,而不是在case参数上进行简单的相等比较,则可以执行以下操作(此处我们测试范围):true?switch(priority <= 1, "low", priority == 2, "medium", priority >= 3, "high")