8.5 小结

这一章的主题是容器。我们主要讲了两个比较有特点的容器,即:字典和集合。

在正式讲解容器之前,我们阐述了什么是索引和可索引对象,以及什么是迭代和可迭代对象。这是两对很重要的概念。

我们已经说过多次,索引其实就是一种编号机制。它可以对一个值中的索引单元进行编号。这种编号也被称为线性索引号,或简称为索引号。有了索引号,我们就可以利用索引表达式对可索引对象中的索引单元进行存取了。这种机制能够有效的关键在于,已存在对应的getindex方法。如果可索引对象是可变的,那么还应该有对应的setindex!方法。

迭代,其实就是按照某种既定的规则、反复地进行同样的操作,直至达到某一个目标的过程。对于容器来说,迭代就是逐一地访问并取出其中的元素值的过程。在 Julia 中,我们可以使用for语句来实现对容器的迭代。我们可以如此操作的关键在于,已存在与这些容器的类型对应的iterate方法。

在阐释了上述的重要概念之后,我们详细地讲解了 Julia 中的标准字典Dict。这个标准字典是一种哈希表的具体实现。所以,它的内部操作基本上都是基于哈希码的。也正因为如此,针对字典的hash方法和isequal方法即是关键中的关键。在讨论字典的类型及其实例化的时候,我用了不少的篇幅说明了具体的原因,以及为什么在有些时候对字典的操作结果并不符合我们的直觉和预期。另外,我们还讨论了操作字典的几种常用方式。

我们可以把集合看成是简化的字典。与字典一样,集合也是无序的容器。但它包含的不是键值对,而是单一的元素值。针对集合的操作有一个很显著的特点,即:它们几乎都是基于集合运算的。对于并集、交集、差集和对称差集,Julia 都提供了相应的函数。在这里,我们同样需要注意类型提升的问题。

在通用编程领域,字典和集合都是非常常用的容器。只要你编写 Julia 程序不是仅为了复现数学公式和基本算法,那么就很有必要掌握这两种容器。你应该对它们的类型定义、实例化方式以及各种操作方法都足够的熟悉。这样才能在编程的过程中信手拈来。