[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 值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值