2009年4月14日星期二

FreeMarker中文手册--KLW 基本概念

基本概念

什么是值?
编程人员可以跳过本部分.
首先举一些样例值,如你日常数学中的那些数字,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,2007(一个日期),变量todayHoliday 的值是false(一个布尔值),变量lotteryNumbers 的值是一个包含20,14,42,8,15的序列.当然也可以说lotteryNumbers包含多个值(例如,它的第二个值是14), 但是lotteryNumbers本省是一个值.这就像一个盒子里可以包含许多其他东西,但是盒子本省仍然是一个东西.最后我们还有一个cargo变量,它是一个哈希表(又像是一个盒子).所以说,值是一些能存储在变量(如user,cargo,cargo.name)中的东西.但是一个值并不需要存在变量中才可以称为值,例如,我们这里有一个值100(可以直接使用):

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

作为计算的临时结果,也称为值,像20,120(当这个模版执行时会计算出的临时结果).该模版会打印120:

${cargo.weight / 2 + 100}

最后解释一点:作为两个值相除的结果,40(cargo.weight)和2,一个新的值20会被创建.然后再加上100,120这个值也会被创建.然后120会被打印,模版会继续执行,这些临时值被丢弃.

现在你大概知道值的意义了吧.

什么是类型

值的一个重要方面就是他们的类型.例如变量user的值类型就是字符串, lotteryNumbers 的值类型是序列.值的类型是重要的,因为她大致确定了你该如何使用该值.比如${user/2}就是一个错误,但是${cargo.weight / 2}是正确的,并且能打印20.因为除法仅对数字有意义,而对字符串无效.另外,使用小数点的时候,像cargo.name,仅当cargo是一个哈希表的时候才有意义.还有,你使用<#list ...> 指令也仅对序列才有意义. <#if ...>指令的条件值类型必须是布尔型.

一个值可以同时有多种类型,尽管这不常见.例如下面的数据模型,mouse是一个字符串,同时是一个哈希:

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

如果你将上面的数据模型整合到这个模版中:

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

输出结果会是:

Yerri
12
brown


数据模型是一个哈希表

从上面几个数据模型的例子中,你已经知道:标记为”root”的只是一个哈希表.当你使用变量user的时候,表示,user变量是存在root(根)哈希中的,就好像你写的是root.user一样.但是实际是没有变量root的.

也许对之前的数据模型你会感到困惑,根哈希表中又包含着另外的哈希表和序列(lotteryNumbers 和cargo).这没有什么特别的.一个哈希表可以包含其他变量.而这些变量包含值,这些值可以是字符串,数字等等.当然这些值也可以是哈希表或者序列.正如之前解释的那样,一个哈希表或者序列也是一个值,和字符串或者数字一样.

没有评论: