跳到主要内容

Data and Mutability / 数据与可变性

源文档地址

看待数据基本上有两种不同的方式。你可以说:「数据是不可变的。红色永远是红色,15 永远是 15。数字 15 不会变异、不会变老、不会变形。π 也一样。」但你也可以把数据想成存放在计算机某块内存里的东西 —— 这难道不也是数据吗?某种可以被存进内存的东西?当然是。那么,如果那块特定内存里存的值变了呢?数据本身不就变了吗?

这个混淆我们解决不了,只能尽量把两种想法分开,说得精确一些。我们的做法是:把两者当作不同的数据来对待。颜色对我们来说永远是不可变的。如果你需要「一个会变的颜色」这种概念,我们后面也许会看看怎么让你做到,但要点在于:你得为此另建一个数据类型。颜色本身不可变。讨论结束。

这样一来,我们又用上了先前把所有可能的数据分门别类的那同一招,来分开「数据究竟是什么」的两种想法 —— 靠数据类型。可变还是不可变,只是关于某个类型的一句陈述:

颜色不可变。数字不可变。字符串(文本)不可变。你自己定义的数据类型,默认也不可变。

不可变是我们的默认

本书后面谈到数据时,你都应该把它想成不可变的。我们大部分基本数据类型都是不可变的。一旦遇到可变类型,我们会同时用上 reference(引用,指向内存里的某个位置)或者「(共享)内存」这样的说法,来凸显它与默认情形的不同。

别的系统主要出于底层性能的考虑,拥抱「数据是指向可变内存的引用」这个想法;我们则拥抱不可变数据,并鼓励你尽可能长时间地只跟这类数据打交道。

比起跟引用打交道,不可变数据让你对数据流的推理愉快得多 —— 数据流是下一章的内容。当程序的一部分在现代处理器的不同核心上并行运行时,不可变数据在推理上同样占优 —— 这是我们把不可变定为默认的另一个理由。