爲什麼我不能添加到scala.collection.Map
?看起來這個trait
沒有這個功能是很沒用的。斯卡拉collection.Map不能添加到
難道他們不能在Iterable
中覆蓋++
方法並將返回類型減少爲Map
?
P.S.我不是說它應該是mutable,只是它應該能夠返回一個新的Map
添加映射(或映射),就像immutable.Map
一樣。
爲什麼我不能添加到scala.collection.Map
?看起來這個trait
沒有這個功能是很沒用的。斯卡拉collection.Map不能添加到
難道他們不能在Iterable
中覆蓋++
方法並將返回類型減少爲Map
?
P.S.我不是說它應該是mutable,只是它應該能夠返回一個新的Map
添加映射(或映射),就像immutable.Map
一樣。
我會在下面留下原始答案,雖然這是非常不正確的,因爲我沒有正確理解問題。
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)
我的猜測是: 如果您有一些收藏並需要爲他人提供只讀的地圖外觀,則此特徵適合作爲原樣使用。如果你在那裏添加它,它不會是正交設計,因爲那時候需要只讀地圖接口。另一方面,如果需要泛型接口中的++操作,它不適用於可變和不可變實現。例如。如果可變集合返回self,那麼通過查看接口會發生什麼並不明顯。
斯卡拉集合庫目前相當有缺陷。 2.8(應該在一個月左右發佈)有一個完全改進的集合庫,我相信它有你正在尋找的行爲。
但不變的地圖*不*定義++運算符!這是我的觀點!它會返回一個添加了映射的(新)映射。如果使用scala.collection.Map是一個不可變的Map,我不明白爲什麼它不能具有一個的功能。畢竟,他們幾乎不會改變Predef是他們嗎? – 2009-06-04 13:36:14
事實上,正如大衛霍爾指出,我的猜測可能不成立。 scala.collections.Map繼承自提供「++」(不可變)操作的scala.collections.generic.MapTemplate。 請參閱MutableMapTemplate中++方法的棄用註釋(由scala.collections.mutable.Map繼承) – 2009-06-08 08:23:04