2009-06-04 62 views
1

爲什麼我不能添加到scala.collection.Map?看起來這個trait沒有這個功能是很沒用的。斯卡拉collection.Map不能添加到

難道他們不能在Iterable中覆蓋++方法並將返回類型減少爲Map

P.S.我不是說它應該是mutable,只是它應該能夠返回一個新的Map添加映射(或映射),就像immutable.Map一樣。

回答

6

我會在下面留下原始答案,雖然這是非常不正確的,因爲我沒有正確理解問題。

Scala的目前的集合庫幾乎爲mutable/immutable實施了不同的添加方法,可能希望在源代碼中明確使用哪種類型的集合。如前所述,2.8版正在修訂中,前提正在消失。

既然如此,抽象類不提供您正在考慮的方法,因爲它們可能存在不可變但不可變的,反之亦然。或者他們可能有相同的名稱,但不同的實現。

因此,它不可能在基類中提供它們。

但是,此外,如果您收到一個scala.collection.map,您不能不能通過把它固定爲可變的,當你收到一個不可變的,反之亦然。

而現在,對於錯誤的答案。 :)

你可以(不,你不能 - 下面的代碼使用scala.collection.imutable.Map)。

scala> val x = Map(1 -> 'a', 2 -> 'b') 
x: scala.collection.immutable.Map[Int,Char] = Map(1 -> a, 2 -> b) 

scala> x ++ Map(3 -> 'c') 
res5: scala.collection.immutable.Map[Int,Char] = Map(1 -> a, 2 -> b, 3 -> c) 

scala> var y = x 
y: scala.collection.immutable.Map[Int,Char] = Map(1 -> a, 2 -> b) 

scala> y += (3 -> 'c') 

scala> y 
res7: scala.collection.immutable.Map[Int,Char] = Map(1 -> a, 2 -> b, 3 -> c) 

scala> x + (3 -> 'c') 
res8: scala.collection.immutable.Map[Int,Char] = Map(1 -> a, 2 -> b, 3 -> c) 
0

我的猜測是: 如果您有一些收藏並需要爲他人提供只讀的地圖外觀,則此特徵適合作爲原樣使用。如果你在那裏添加它,它不會是正交設計,因爲那時候需要只讀地圖接口。另一方面,如果需要泛型接口中的++操作,它不適用於可變和不可變實現。例如。如果可變集合返回self,那麼通過查看接口會發生什麼並不明顯。

+0

但不變的地圖*不*定義++運算符!這是我的觀點!它會返回一個添加了映射的(新)映射。如果使用scala.collection.Map是一個不可變的Map,我不明白爲什麼它不能具有一個的功能。畢竟,他們幾乎不會改變Predef是他們嗎? – 2009-06-04 13:36:14

+0

事實上,正如大衛霍爾指出,我的猜測可能不成立。 scala.collections.Map繼承自提供「++」(不可變)操作的scala.collections.generic.MapTemplate。 請參閱MutableMapTemplate中++方法的棄用註釋(由scala.collections.mutable.Map繼承) – 2009-06-08 08:23:04

1

斯卡拉集合庫目前相當有缺陷。 2.8(應該在一個月左右發佈)有一個完全改進的集合庫,我相信它有你正在尋找的行爲。