scala collection.Map无法添加到

时间:2009-06-04 09:14:26

标签: scala map scala-collections

为什么我无法添加scala.collection.Map?如果没有此功能,这个trait似乎毫无用处。

他们无法覆盖++中的Iterable方法并将返回类型缩减为Map吗?

P.S。我并不是说它应该是 mutable ,只是它应该能够返回一个带有添加映射(或映射)的新Map,与{{1}相同}。

3 个答案:

答案 0 :(得分:6)

我会在下面留下原来的答案,虽然这是非常不正确的,因为我没有正确理解这个问题。

Scala目前的集合库几乎强制执行可变/不可变的不同添加方法,可能希望在源代码中明确使用什么类型的集合。如上所述,这是在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)

答案 1 :(得分:1)

Scala集合库目前存在严重缺陷。 2.8(将在一个月左右发布)有一个完全翻新的馆藏库,我认为它具有您正在寻找的行为。

答案 2 :(得分:0)

我的猜测是: 如果您有一些收集并且需要为其他人提供只读地图外观,则此特征适合于该作业。如果你在那里包含加法,那么它将不是正交设计,因为那时需要只读地图接口。另一方面,如果需要在通用接口中进行++操作,则它不适用于可变和不可变的实现。例如。如果可变集合在返回时返回self,那么通过查看接口就会发生什么事情并不明显。