1

AFAIK 应用于不可变集合的 Scala 集合操作返回一个新集合,由于结构共享,该集合共享前者的大部分结构。

我的问题是:考虑到这些操作也可以应用于返回新结构的可变数据结构,对于不可变集合,结构共享是否到位?

4

2 回答 2

3

不,结构共享只有在保证共享的部分永远不会改变时才有可能。以不可变列表为例: prepend 返回与原始列表共享除第一个元素之外的所有内容的列表是安全的,原因是原始列表永远不会改变。如果这个保证没有到位,那么 prepend 方法将不得不复制整个列表,以便对原始列表的更改不会影响新列表。对于可变集合不提供此保证(因为原始集合实际上可以更改),因此可变集合不能利用结构共享。

于 2013-08-27T20:30:54.570 回答
1

不,因为这样的共享会违反两者中的任何一个:返回具有修改内容的新对象,并且在修改新对象时不修改原始集合。共享结构仅适用于不可变集合,因为不可变性消除了在另一个对象更改时更改一个对象的风险。

当然,在内容级别存在共享,例如在 amutable.List[String]中,新列表使用对与原始列表相同的String实例的引用,但这就是它结束的地方。

于 2013-08-27T20:27:21.590 回答