【问题标题】:scala collection.Map cannot be added toscala collection.Map 无法添加到
【发布时间】:2010-10-31 06:27:25
【问题描述】:

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

难道他们不能覆盖Iterable 中的++ 方法并将返回类型减少为Map

附:我并不是说它应该是可变的,只是它应该能够返回一个新的Map,并添加一个(或多个映射),与immutable.Map 相同。

【问题讨论】:

    标签: scala map scala-collections


    【解决方案1】:

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

    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)
    

    【讨论】:

    • 嗯。在我看来,通过创建两种都称为 Map 的类型,它们都扩展了 collections.Map 但行为完全不同,Scala 库的创建者已经创造了这样一种情况,在这种情况下,我可以“通过将 [something] 视为可变的 [it is ] 不可变”。如果他们不想这样,他们就不应该有一个共享的超类型!
    • 它们都是地图,因为它们都是可以通过键访问的集合。那是一张地图。而且,正如您自己发现的那样,这些课程是这样编写的,因此您不会搞砸自己。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我的猜测是: 如果你有一些集合并且需要为其他人提供一个只读的 Map 外观,那么这个特性就适合这个工作。如果您在其中添加添加内容,则不会是正交设计,因为那时需要只读地图界面。另一方面,如果需要泛型接口中的 ++ 操作,则它不适用于可变和不可变实现。例如。如果 mutable 集合在添加时返回 self,那么仅通过查看界面就不会明显发生什么。

      【讨论】:

      • 但是不可变的 Map 确实定义了一个 ++ 运算符!这就是我的观点!它返回一个添加了映射的(新)映射。如果使用 scala.collection.Map 隐含地是一个不可变的 Map,我不明白为什么它不能具有它的功能。毕竟,他们几乎不会更改 Predef 是吗?
      • 确实,正如 David Hall 指出的那样,我的猜测可能不成立。 scala.collections.Map 继承自提供“++”(不可变)操作的 scala.collections.generic.MapTemplate。但是请参阅 MutableMapTemplate 中 ++ 方法的弃用注释(由 scala.collections.mutable.Map 继承)
      • (我看了2.8 svn的主干源码)
      猜你喜欢
      • 2014-10-24
      • 2019-10-02
      • 1970-01-01
      • 2013-08-04
      • 2018-01-13
      • 2012-10-24
      • 2015-02-28
      • 2020-05-11
      • 1970-01-01
      相关资源
      最近更新 更多