为什么我不能添加到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