【发布时间】:2013-08-30 11:04:44
【问题描述】:
AFAIK 应用于不可变集合的 Scala 集合操作返回一个新集合,由于结构共享,该集合与前者共享大部分结构。
我的问题是:考虑到这些操作也可以应用于返回新结构的可变数据结构,结构共享是否与不可变集合一样到位?
【问题讨论】:
标签: scala immutability scala-collections mutable
AFAIK 应用于不可变集合的 Scala 集合操作返回一个新集合,由于结构共享,该集合与前者共享大部分结构。
我的问题是:考虑到这些操作也可以应用于返回新结构的可变数据结构,结构共享是否与不可变集合一样到位?
【问题讨论】:
标签: scala immutability scala-collections mutable
不,结构共享只有在保证共享的部分永远不会改变时才有可能。以不可变列表为例:prepend 返回一个与原始元素共享除第一个元素之外的所有元素的列表是安全的,原因是原始元素永远不会改变。如果这个保证没有到位,前置方法将不得不复制整个列表,以便对原始列表的更改不会影响新列表。对于可变集合不提供此保证(因为原始集合实际上可以更改),因此可变集合不能利用结构共享。
【讨论】:
不,因为这样的共享会违反两者中的任何一个:返回具有修改内容的新对象,并且在修改新对象时不修改原始集合。共享结构仅适用于不可变集合,因为不可变性消除了在另一个对象更改时更改一个对象的风险。
当然还有内容层面的分享,例如在 mutable.List[String] 中,新列表使用与原始列表相同的 String 实例的引用,但这就是它的结束位置。
【讨论】: