[FreeMarker 2.3.20] Part I 關於模版設計的介紹 ~值和類型~ 基礎概念

概要

              Note

              看此章節就認爲你已經閱讀過前邊的 準備 章節了。


要想理解 data-model,理解值和類型概念就是一個關鍵部分。但是就如你隨後所見的,值和類型的概念其實不只是侷限在 data-model 上。


什麼是值?


真正的程序員可以安全地跳過這個章節


舉個關於值類型的例子吧,我們每天都會接觸到的數學數字,如16,0.5等等。但是在計算機語言上來說值的概念就比較廣了,其不一定就是代表數字。比如說像下邊的例子:

(root)
 |
 +- user = "Big Joe"
 |
 +- today = Jul 6, 2007
 |
 +- todayHoliday = false
 |
 +- lotteryNumbers
 |   |
 |   +- (1st) = 20
 |   |
 |   +- (2st) = 14
 |   |
 |   +- (3rd) = 42
 |   |
 |   +- (4th) = 8
 |   |
 |   +- (5th) = 15
 |
 +- cargo
     |
     +- name = "coal"
     |
     +- weight = 40  

我們可以說 user 變量的值爲 "Big Joe" (一個字符串), today 的值爲 Jul 6 20007 (一個日期), todayHoliday 的值爲 false (一個 boolean,類似一組 yes/no 的東西,這麼理解應該說只要是有正反兩面的事物似乎都可以用 boolean 來描述了,不知道這個理解是否正確了? )  變量lotteryNumbers變量的值是一個包含 20,14,42,8,15 的序列。當然lotteryNumbers 從它含有多個值的情況下看是一個多值變量(比如說, 它的第二個 item 是一個爲14的值),但是呢,lotteryNumbers本身仍然只是一個單值變量。這就像是一個裝了很多別的東西的盒子,盒子本身是可以被看作爲一個單一的值。最後,我們有個很重要的變量cargo, 它是一個 hash(又是一個像是盒子的變量)。這裏我們可以總結下,值其實就是一些能夠被放入變量的東西(e.g., 比如放入user,cargo,cargo.name中)。但是呢就算一個不放入變量的值我們仍然稱之爲一個值,比如說在這裏我們有 100 這個值:

<#if cargo.weight < 100>Light cargo</#if>

臨時算出來的結果,它們也被稱之爲值,就像下邊這個模板在執行過程中的值 20 和 120 一樣:

${cargo.weight / 2 + 100}

最後再解釋一下:當 40 (cargo 的重量), 2 這兩個值作除法時產生的新值20, 然後加上120, 得到120,最終其會被輸出來( ${...}),隨着模板的執行這所有的值都會丟失。


到現在關於值這個概念應該有所認識了。


什麼是類型?


值其實有個非常重要的信息,就是它們的類型。比如說 user 變量的值類型是 string 類型,lotteryNumbers的類型就是 sequence。值的類型是一個非常重要的概念,它在一定程度上 (to a large extent) 決定了如何以及在哪裏使用那個值。就像${user / 2}是一個錯誤的寫法, 但是${cargo.weight / 2} 則是對的並且結果是 20, 畢竟除法是隻作用於數字的,而對string卻是無效的。同樣,在 cargo.name中的 點運算符也只有當cargo是一個 hash 類型的變量時纔會起作用, 在<#list ....> 中只能使用 sequences類型, 在 <#if ...> 的 條件判斷部分必須最終是一個 boolean 類型等等。


              Note

              一個小的術語, 我們說 "a boolean","a boolean value ","a value of type boolean "是指的同一個概念。


一個值在同一時候可能有多種不同的類型,雖然這個很少能體現它的作用。比如在下邊的 data-model 中 mouse 這個變量同時是一個 string 和 一個 hash:

(root)
 |
 +- mouse = "Yerri"
     |
     +- age = 12
     |
     +- color = "brown"


如果將上述的data-model 和模板相結合:

${mouse}       <#-- uses mouse as a string -->
${mouse.age}   <#-- uses mouse as a hash -->
${mouse.color} <#-- uses mouse as a hash -->  

將會得到如下結果:

Yerri
12
brown


data-model 是一個 hash


回顧之前的 data-model 例子你可能就已經意識到這一點了:那個被標註爲 (root) 的東西是一個 hash 類型的值。當你在寫比如 user 時,這就表示你想要去存在 root hash 類型中的 user 變量。就像你寫 root.user 一樣,當然這裏並沒有一個叫做 "root" 的變量,所以它是不起作用的。


在我們的 data-model 中令人困惑的就是 root hash, 它包含了更多的 hash 和sequence (lotteryNumbers,cargo)。 不過這個並沒有什麼特殊的。一個 hash 容器(變量),可以包含其他的變量,它們可能存有一個值,是 string類型,數字類型等,當然也是可以爲 hash 類型 和 sequence 類型了。如同前面所解釋的,一個 hash, sequence 就如同 string 和 number 一樣只是yge 值。

發佈了13 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章