跳到主要内容

Data and Mutability / 数据与可变性

源文档地址

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

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

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

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

Immutability is our default / 不可变是我们的默认​

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

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

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