【问题标题】:scala Map filterKeys: Projection cannot be assigned to a Map referencescala Map filterKeys:无法将投影分配给地图参考
【发布时间】:2010-10-31 06:13:28
【问题描述】:

以下代码:

var m: Map[String, Int] = Map("A" -> 1, "BB" -> 2, "CCC" -> 3)

m = m filterKeys { s => s.length < 3 }

不编译。我收到以下错误:

错误:类型不匹配
找到:collection.this.Map.Projection[scala.this.Predef.String,scala.this.Int]
必需:collection.this.Map[scala.this.Predef.String,scala.this.Int]
m = m filterKeys { s => s.length

我不太明白这一点,因为根据scaladoc 一个 Projection[A,B] 扩展了特征 Map[A,B+]。也就是说,Projection 就是 Map

我认为这可能与逆变类型 B 有关,但如果我使用 Any 而不是 Int,它仍然无法编译。我错过了什么?解决办法是:

var m: Map[String, Int] = Map("A" -> 1, "BB" -> 2, "CCC" -> 3)

m = Map(m filterKeys { s => s.length < 3 } toSeq : _ *) 

但这对我来说似乎很不雅。

【问题讨论】:

    标签: scala maps projection


    【解决方案1】:

    好的 - 这已经在 scala 控制台的帮助下解决了:

    scala> var m = Map("A" -> 1, "BB" -> 2, "CCC" -> 3)
    m: scala.collection.immutable.Map[java.lang.String,Int] = Map(A -> 1, BB -> 2, CCC -> 3)
    

    所以类型推断将 m 的类型推断为不可变映射。以下代码将编译OK:

    var m: collection.Map[String, Int] = Map("A" -> 1, "BB" -> 2, "CCC" -> 3)
    m = m filterKeys { s => s.length < 3 }
    

    但是,这并没有多大帮助,因为无法以返回collection.Map 的方式添加地图。我认为他们应该重写从Iterable 继承的++ 方法,并将Map 作为返回类型。

    有人可以对此发表评论吗? collection.Map 有什么用?

    【讨论】:

      【解决方案2】:

      我很好奇为什么您希望 m 成为 var 而不是 val - 如果您不尝试将 Map 重新分配给自身,事情似乎可以正常工作,如 repl 所示,这更符合在可能的情况下优先考虑不变性的 scala 哲学:

      scala> val m = Map("A" -> 1, "BB" -> 2, "CCC" -> 3) 
      m: scala.collection.immutable.Map[java.lang.String,Int] = Map((A,1), (BB,2), (CCC,3))
      
      scala> val n = m filterKeys { s => s.length < 3 }
      n: scala.collection.immutable.Map[java.lang.String,Int] = Map((A,1), (BB,2))
      

      我发现这个问题有点老了,考虑到集合类的主要重构,您在 Scala 2.8 中看到的行为可能有所不同。

      【讨论】:

        【解决方案3】:

        使用

        m.view.filterKeys(x=>x.length <3).toMap
        

        【讨论】:

          猜你喜欢
          • 2011-01-08
          • 2023-04-08
          • 1970-01-01
          • 2019-12-18
          • 2015-12-25
          • 2020-11-26
          • 2022-01-20
          • 2016-11-02
          • 1970-01-01
          相关资源
          最近更新 更多