类型独立的内置
这些是内置的,根本不关心其左手参数的类型。
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:
-
matchedValue
与case
参数值的比较的行为与==运算符完全相同。因此,它仅比较标量和仅相同类型的值。因此,像x?switch(1, "r1", "c2", "r2")
这样的东西是没有意义的,好像x
是非数字的,则第一种情况将导致错误,而如果x
是数字的,则第二种情况将导致错误(除非x
是1
,否则我们将不会在第一个之后进行进一步比较)。 -
与普通方法调用不同,仅评估确实需要的
switch(...)
参数。例如,在two()?switch(c1(), r1(), c2(), r2(), c3(), r3())
中,如果two()
返回2
,c1()
返回1
,并且c2()
返回2
,则仅将调用以下函数,并按此 Sequences:m()
,c1()
,c2()
,r2()
。 (自然地,未求值的参数可以引用丢失的变量而不会导致错误.)可以保证case
参数表达式从左到右求值,直到找到第一个匹配项。还可以确保仅对属于第一个匹配case
的result
表达式进行求值。还保证只有在没有匹配的case
参数时才对defaultResult
表达式求值。 -
case
参数表达式不必是常量值,它们可以是任意复杂的表达式。当然,result
,defaultResult
和matchedValue
也是一样。 -
对
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")