数据模型初览
正如你已经见过,数据模型基本上是一棵树。这棵树可以任意地深和复杂,例如:
(root)
|
+- animals
| |
| +- mouse
| | |
| | +- size = "small"
| | |
| | +- price = 50
| |
| +- elephant
| | |
| | +- size = "large"
| | |
| | +- price = 5000
| |
| +- python
| |
| +- size = "medium"
| |
| +- price = 4999
|
+- test = "It is a test"
|
+- whatnot
|
+- because = "don't know"
变量(起类似树干目录作用的,如root,animals,mouse,elephant,python,whatnot)被称作散列(哈希),散列中存着其他变量(子变量),可以根据名字查找(如 animals,mouse,price)
只存单个值的变量(size,price,test和because)称为标量scalars。
当你想在模版中使用子变量时,需要指明从root到该节点的路径,使用小数点”.”作为分隔符。访问mouse中的price,首先从root开始,到达animals,然后进入mouse,再进入price,所以你需要这样写animals.mouse.price(root,根节点是逻辑上的,实际上不存在,不用写---KLW注)。当你在一个表达式两端加上${ . . . }时,你就告诉了FreeMarker在这里输入相应文本。
还有一种更重要的变量:序列(数组)。它们和散列类似,但是他们不存储变量名,而按照数组方式保存子变量,你可以使用数字索引访问变量。例如,在下面的数据模型中,animals和whatnot.fruits是序列(数组):
(root)
|
+- animals
| |
| +- (1st)
| | |
| | +- name = "mouse"
| | |
| | +- size = "small"
| | |
| | +- price = 50
| |
| +- (2nd)
| | |
| | +- name = "elephant"
| | |
| | +- size = "large"
| | |
| | +- price = 5000
| |
| +- (3rd)
| |
| +- name = "python"
| |
| +- size = "medium"
| |
| +- price = 4999
|
+- whatnot
|
+- fruits
|
+- (1st) = "orange"
|
+- (2nd) = "banana"
访问数组中的子变量,你可以按数组方式访问(中括号中加数字索引)。索引从0开始(编程惯例),所以第一个元素的索引是0,第二个元素的索引是1,依此类推。所以要获得第一个animal的name,你只需如此:animals[0].name。访问whatnot.fruits中的第二个元素(字符串“banana”),使用如下:whatnot.fruits[1]。
标量可以继续细化为以下几种:
- 字符串:文本,任意序列的字符,如”m”,”o”,”u”,”s”,”e”。例如,上例中的所有name和size都是字符串。
数字:数字类型的值,如上例中的所有price。字符串“50”和数字50在FreeMarker中两种完全不同的类型。前者只是一个由两个字符组成的序列(仅仅是刚好可以被我们理解为数字,而FreeMarker不会这么理解的)。后者是一个数字值,可以作代数运算。
日期/时间:一个日期,或者时间,比如捕获动物的日期,或者商店开门的时间。
布尔型:布尔型值,true或者false,yes或者no。比如animals可以有一个projected子变量,表示这个动物是否被保护。
摘要:
- 数据模型可以用数结构可视化地表示
- 标量存单个值:这个值可以是字符串、数字、日期时间或者布尔类型。
- 散列值中包含着其他变量,同时它们拥有一个全局独一无二的名字。
- 序列(数组)中按照数组方式存值,值可以用从0开始的索引访问。
没有评论:
发表评论