2009-06-04 57 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(应该在一个月左右发布)有一个完全改进的集合库,我相信它有你正在寻找的行为。