Pharo 的标准库中是否有不可变的数据结构,例如映射和集合?

Does Pharo have immutable data structures such as maps and sets in its standard library?

我可能刚刚错过了它们,但我似乎无法在 Pharo 中找到任何关于不可变数据结构的提及。来自函数式语言,我发现不可变映射和集合在各种场合都很有用。尽管 Pharo 特别偏向于使用突变,但如果还没有人开始实施它们,我会感到惊讶。

完全有可能有人实现了类似的东西。也许将来会有不可变的 collection 作为主库的一部分。然而,目前还没有这样的东西,原因很简单:为什么? 当我开始学习 Pharo 时,我对 null-propagation 的想法着迷Objective-C(如果您有 null,并且您向 null 发送消息,您将返回 null,等等...)所以我做的第一件事是在 Pharo 中实现 null 传播。这很有趣,很有教育意义,但完全没用。这是无用的,因为没有人以这种方式使用 Pharo,在这种情况下这是一种错误的方法。我强烈建议您在 Pharo 中创建自己的不可变 collection。

但是当你这样做的时候,想想什么应该是不可变的,为什么。是缩小还是扩大 collection?数组就是这样——它们是固定大小的。是关于不能 add/remove/swap 元素吗?但是如果你得到一个元素并修改它呢?最后,考虑这个例子:

array := #('a' 'b' 'c').

array first become: 'd'.

array = #('d' 'b' 'c')

我没有使用任何 setter,但我最终还是可以得到一个不同的数组。

Pharo 社区关心透明度和良好的设计。众所周知,你不应该直接修改 collection 的内容,你不应该从外部与 objects 的内部状态交互,等等……另一方面,没有人会打你如果你想这样做的话。我的意思是,如果您制作原型怎么办?如果你破解怎么办?如果真的没有其他办法怎么办?你总是可以选择,问题是我们如何帮助人们了解更好的选择。

P.S。我的回答听起来好像不变性并不重要。事实并非如此。甚至还有 read-only objects 的原型,可以用来保证一定程度的安全性。尽管

想出一个适用于所有的单一概念并不是那么简单

http://source.lukas-renggli.ch/container/ 处的代码实现了现代容器和迭代器库;具有可变和不可变列表;不可修改的观点;以及排序、有序和无序的集合和映射数据结构。它还支持使用常见的过滤、映射、展平、分区等操作对所有容器进行高效的惰性迭代。

我并不是说该库具有完美的设计或比标准集合库更高效,但它肯定是进一步探索的良好起点。