1. 正如已经看到的, 数据模型的基本结构是树状的。 这棵树可以很复杂, 并且可以有很大的深度, 比如:
2. 上图中的变量扮演目录的角色(比如: root, animals, mouse, elephant, python, misc)被称为hashes(哈希表或哈希)。哈希表存储其他变量(被称为子变量), 它们可以通过名称来查找(比如: "animals", "mouse"或"price")。
3. 存储单值的变量(protected, price, message和foo)称为scalars(标量)。
4. 如果要在模板中使用子变量, 那应该从根root开始指定它的路径, 每级之间用点来分隔开。要访问mouse的price, 要从root开始, 首先进入到animals, 之后访问mouse, 最后访问price。就可以这样来写animals.mouse.price。
5. 另外一种很重要的变量是sequences(序列)。它们像哈希表那样存储子变量, 但是子变量没有名字, 它们只是列表中的项。比如, 在下面这个数据模型中, animals和misc.timeline就是序列:
6. 要访问序列的子变量, 可以使用方括号形式的数字索引下标。索引下标从0开始(从0开始也是程序员的传统), 那么第一项的索引就是0, 第二项的索引就是1等等。要得到第一个动物的名称的话, 可以这么来写代码animals[0].name。要得到misc.timeline中的第二项(日期Jul 3, 2017)可以这么来写misc.timeline[1]。
7. 标量类型可以分为如下的类别
7.1. 字符串: 就是文本, 也就是任意的字符序列, 比如上面提到的"elephant"。
7.2. 数字: 这是数值类型, 就像上面的price。在FreeMarker中, 字符串"50"和数字50是两种完全不同的东西。前者是两个字符的序列(这恰好是人们可以读的一个数字), 而后者则是可以在数学运算中直接被使用的数值。
7.3. 日期/时间: 可以是日期-时间格式(存储某一天的日期和时间), 或者是日期(只有日期, 没有时间), 或者是时间(只有时间, 没有日期)。
7.4. 布尔值: 对应着对/错(是/否, 开/关等值)类似的值。比如动物可以有一个protected(受保护的)的子变量, 该变量存储这个动物是否被保护起来的值。
8. 总结
8.1. 数据模型可以被看成是树形结构。
8.2. 标量用于存储单一的值。这种类型的值可以是字符串, 数字, 日期/时间或者是布尔值。
8.3. 哈希表是一种存储变量及其相关且有唯一标识名称的容器。
8.4. 序列是存储有序变量的容器。存储的变量可以通过数字索引来检索, 索引通常从0开始。