0

次のコード:

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 < 3 }

scaladoc a Projection[A,B]extends the traitによると、私はこれを本当に理解していませんMap[A,B+]。つまり、 Projection は Mapです。

反変型と関係があるのではないかと思いましたが、代わりにBを使用すると、まだコンパイルされません。私は何が欠けていますか?解決策は次のとおりです。AnyInt

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

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

しかし、これは私にはエレガントではないようです。

4

3 に答える 3

0

なぜmをvalではなくvarにしたいのか興味があります-マップをそれ自体に再割り当てしようとしていない場合は、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))

質問は古いものだと思います。コレクションクラスの主要なリファクタリングを考えると、Scala2.8では表示されている動作が異なる可能性があります。

于 2011-05-02T02:16:43.010 に答える
0

OK - これは 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 の型を不変マップであると推論しています。次のコードは正常にコンパイルされます。

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ますか?

于 2009-06-04T09:11:31.373 に答える