基本内容

优质
小牛编辑
133浏览
2023-12-01

这里假设你已经阅读完 入门 章节的内容了。

理解数值和类型的概念是理解数据模型的关键和基础。 但数值和类型的概念并不局限于数据模型,下面你就会看到了。

什么是数值?

这部分对于程序员来说可以直接跳过的。

正如你知道的,来自于每天所使用的数字,比如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

变量 uservalue 是"Big Joe"(字符串), todayvalue 是 Jul 6, 2007 (日期),todayHolidayvalue 是false(布尔值,比如yes/no等值)。 lotteryNumbersvalue 是包含20,14, 42, 8, 15的序列。当然在这种意义上, lotteryNumbers 是多值类型。它 包含 多个值(比如,其中的第二项的 value 是14),但是 lotteryNumbers 本身还是单值。它就像一个装有其它很多东西的盒子 (或称之为容器,译者注),但盒子作为整体还是视作单独的。最后还有一个数值 cargo,它的 value 是一个哈希表 (也是类似盒子一样的东西)。所以说,数值就是存储在变量中的(比如,在 usercargocargo.name 中)的那个东西。但是, 不需要存储于变量之中的数值也可以称之为数值,比如下面的数字100:

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

当模板被执行时,计算出的临时结果也称为数值,比如这里的20和120(它会打印120):

${cargo.weight / 2 + 100}

这里针对最后一种表示进行解释:有两个数,40(货物的重量)和2, 相除的结果是20,这是一个新计算出来的数值。然后,把它和100相加, 那么120就计算出来了,接着就打印出来。 (${...}),之后模板继续向下执行, 直到所有结果都计算出来。

现在你应该能体会到数值这个词的含义了。

什么是类型?

数值中非常重要的一个概念就是类型。比方说,变量 user 的类型是字符串,变量 lotteryNumbers 的类型是序列。数值的类型这个概念非常的重要,因为它决定了这些数值可以在哪里使用的最大限度。 比如说,使用 ${user / 2} 就是错误的,但是使用 ${cargo.weight / 2} 就能计算出结果,为20, 因为算术中的除法仅对数字类型的值有效,而不能用于字符串。 仅当 cargo 是一个哈希表变量时,表达式 cargo.name 才可以使用点。也可以用 <#list ...> 指令来遍历序列。而 <#if ...> 指令的条件只能是布尔值等。

Note:

这里说一点点的术语:称 "布尔" 或 "布尔值" 或 "布尔类型" 都是相同的含义。

数值同时也可以含有多种类型,尽管很少这么使用。看一下下面这个数据模型 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.user一样,这里但并没有名"root"为的变量, 那么这就起不到任何作用了。

某些人也许会被这种数据模型的例子所困惑,也就是说,根哈希表包含更多的哈希表或序列 (lotteryNumbers and cargo)。其它就没有更特殊的内容了。 哈希表包含其他变量,那些变量包含其它值,这些数值可以是字符串,数字等变量, 当然也可以是哈希表或序列变量。最初我们解释过的,就像字符串和数字, 序列或哈希表也是一种值的表示形式。