freeMarker模板語言參考:內建函數參考⑨獨立類型內建函數

獨立類型內建函數

switch

這是 switch-case-default 指令 的基本內聯(表達式)版本。它的通用版本就像 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>
也就是說, switch 會找到第一個 case 和參數 (從左到右)值 matchedValue 相等, 
之後返回直接在 case 參數後的 result 參數的值, 
如果它沒有找到一個相等的 case,那麼就返回 defaultResult 的值,
如果沒有 defaultResult 參數 (換言之,參數的個數是基數),
那麼就發生錯誤中止模板處理

在這裏插入圖片描述
更多細節:

  • The comparison of matchedValue 和 case 參數值的比較, 就像 == 操作符。那就只比較標量並且是相同類型的值。因此,諸如 x?switch(1, “r1”, “c2”, “r2”) 就沒有意思。就像 x 是非數字值,那麼第一個case就會引發錯誤, 若 x 是數字值,那麼第二個case就會引發錯誤 (除非 x 是 1, 那麼就不會在第一個參數之後做更多的比較)
  • 不像普通的方法調用, switch(…) 的那些參數被評估爲確實需要的。比如,在 two()?switch(c1(), r1(), c2(), r2(), c3(), r3()) 中,如果 two() 返回 2, c1() 返回 1, 且 c2() 返回 2,那麼只有下面的函數會被調用,而且順序是這樣: m(), c1(),c2(), r2()。(很自然地, 參數不被評估可以指向不存在的變量而不會引發錯誤。) 它保證了 case 參數表達式被從左到右進行評估,直到第一個匹配項被找到。 它也保證了只有屬於第一個匹配 case 的 result 表達式會被評估。它還保證瞭如果沒有匹配的 case 參數,那麼 defaultResult 表達式會被評估
  • case 參數表達式不需要是常量值,它們可以是任意複雜的表達式。 當然,邏輯在 result, defaultResult 和 matchedValue 中也是相同的
  • 對 case 參數值的類型沒有任何限制,比如它們可以是字符串,或數字,或日期等… 但因爲 == 操作符的特性,那麼在 相同的 switch 中使用不同類型的 case 參數是沒有意義的 (請參考之前的解釋)
  • 不像使用 case 指令,那裏沒有向下通過的行爲,也就是說,不需要相等的 break 指令
  • 如果需要對布爾值進行switch操作,那麼應該使用 then 內建函數 來代替,比如 matchedBoolean?then(whenTrue, whenFalse)
  • 如果需要在 case 參數中進行任意的邏輯測試來代替簡單的相等比較,那麼可以這麼來做 (這裏我們測試範圍): true?switch(priority <= 1, “low”, priority == 2, “medium”, priority >= 3, “high”)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章