scala集合。无法将映射添加到

scala集合。无法将映射添加到,scala,map,scala-collections,Scala,Map,Scala Collections,为什么我不能添加到scala.collection.Map?如果没有这个功能,这个trait似乎毫无用处 难道他们不能在Iterable中重写++方法并将返回类型减少为映射 另外,我不是说它应该是可变的,只是它应该能够返回一个新的带有一个或多个映射的映射,就像一个不可变的映射一样 如果您有一些集合,并且需要为其他人提供一个只读的映射外观,那么这种特性就适合当前的工作。若你们在那个里加入了加法,那个么它将不是正交设计,因为那个时你们需要只读的映射接口。另一方面,如果需要泛型接口中的++操作,则它不

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

难道他们不能在
Iterable
中重写
++
方法并将返回类型减少为
映射

另外,我不是说它应该是可变的,只是它应该能够返回一个新的带有一个或多个映射的映射,就像一个不可变的映射一样 如果您有一些集合,并且需要为其他人提供一个只读的映射外观,那么这种特性就适合当前的工作。若你们在那个里加入了加法,那个么它将不是正交设计,因为那个时你们需要只读的映射接口。另一方面,如果需要泛型接口中的++操作,则它不适用于可变和不可变实现。例如,如果可变集合在加法时返回self,仅通过查看接口就不清楚会发生什么。

我的猜测是:
如果您有一些集合,并且需要为其他人提供一个只读的映射外观,那么这种特性就适合当前的工作。若你们在那个里加入了加法,那个么它将不是正交设计,因为那个时你们需要只读的映射接口。另一方面,如果需要泛型接口中的++操作,则它不适用于可变和不可变实现。例如,如果可变集合在添加时返回self,那么仅仅通过查看接口就不清楚会发生什么。

Scala集合库目前存在相当大的缺陷。2.8(将在一个月左右发布)有一个完全改进过的集合库,我相信它具有您想要的行为。

Scala集合库目前存在相当大的缺陷。2.8(大约一个月后发布)有一个经过彻底改造的集合库,我相信它具有您想要的行为。

我将在下面留下原始答案,尽管它非常不正确,因为我没有正确理解这个问题

Scala目前的集合库几乎为可变/不可变强制了不同的添加方法,可能是希望在源代码中明确使用的集合类型。如前所述,这一点在2.8中进行了修改,这一前提正在消失

在这种情况下,抽象类并没有提供您正在考虑的方法,因为它们可能是为不可变而存在的,而不是为可变而存在的,反之亦然。或者它们可能有相同的名称,但实现不同

因此,不可能在基类中提供它们

但是,另外,请注意,通过这种方式,如果您收到scala.collection.map,当您收到一个不可变的时,您不能将其视为可变的,反之亦然

现在,请回答错误的问题。:)

您可以(不,您不能——下面的代码使用scala.collection.imutable.Map)


我将在下面留下最初的答案,尽管它非常不正确,因为我没有正确理解这个问题

Scala目前的集合库几乎为可变/不可变强制了不同的添加方法,可能是希望在源代码中明确使用的集合类型。如前所述,这一点在2.8中进行了修改,这一前提正在消失

在这种情况下,抽象类并没有提供您正在考虑的方法,因为它们可能是为不可变而存在的,而不是为可变而存在的,反之亦然。或者它们可能有相同的名称,但实现不同

因此,不可能在基类中提供它们

但是,另外,请注意,通过这种方式,如果您收到scala.collection.map,当您收到一个不可变的时,您不能将其视为可变的,反之亦然

现在,请回答错误的问题。:)

您可以(不,您不能——下面的代码使用scala.collection.imutable.Map)


但是不可变映射确实定义了一个++操作符!这就是我的观点!它返回一个添加了映射的(新)映射。如果使用scala.collection.Map隐式地是一个不可变的映射,我不明白为什么它不能具有不可变映射的功能。毕竟,他们几乎不会改变Predef,是吗?事实上,正如大卫·霍尔指出的那样,我的猜测可能不成立。scala.collections.Map继承自提供“++”(不可变)操作的scala.collections.generic.MapTemplate。但是,请参见MutableMapTemplate(由scala.collections.mutable.Map继承)中有关++方法的弃用注释(我查看了2.8 svn主干源代码),但不可变映射确实定义了一个++运算符!这就是我的观点!它返回一个添加了映射的(新)映射。如果使用scala.collection.Map隐式地是一个不可变的映射,我不明白为什么它不能具有不可变映射的功能。毕竟,他们几乎不会改变Predef,是吗?事实上,正如大卫·霍尔指出的那样,我的猜测可能不成立。scala.collections.Map继承自提供“++”(不可变)操作的scala.collections.generic.MapTemplate。但是,请参见MutableMapTemplate(由scala.collections.mutable.Map继承)中有关++方法的弃用注释(我查看了2.8 svn主干源代码)Hmmmm。在我看来,通过创建两种类型(都称为Map),它们都扩展了collections.Map,但行为完全不同,Scala库的创建者已经创造了这样一种情况,即我可以“在[某事物]不可变时,将其视为可变的”,从而“搞砸了”。如果他们不想这样,他们就不应该有一个共享的超类型!它们都是映射,因为它们都是可以通过键访问的集合。那是一张地图。而且,正如你自己发现的,这些课程的编写是为了让你不会把自己搞砸。在我看来,通过创建两种类型(都称为Map),它们都扩展了collections.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)