2013-08-27 52 views
1

AFAIK應用於不可變集合的Scala集合操作返回一個新集合,它由於結構共享而共享前者的大部分結構。Scala對可變集合的不可變操作

我的問題是:考慮到這些操作也可以應用於返回新結構的可變數據結構,是否就像不可變集合一樣進行了結構共享?

回答

3

不,結構共享只有在共享部分保證永不改變時纔可能。以不可變列表爲例:prepend可以安全返回除第一個元素之外的所有元素的列表,原始元素永遠不會改變。如果此保證沒有到位,則預付方法將不得不復制整個列表,以便對原始的更改不會影響新列表。對於可變集合,不提供這種保證(因爲原始集合實際上可能會更改),因此可變集合不能使用結構共享。

1

不,因爲這樣的共享會違反二者之一:在修改新對象時返回具有修改內容的新對象並且不修改原始集合。共享結構只適用於不可變集合,因爲不變性消除了另一個對象更改時更改一個對象的風險。

當然,在內容級別上有共享,例如,在mutable.List[String]中,新列表使用與原始相同的String實例的引用,但這是它結束的位置。