に追加できないのはなぜscala.collection.Map
ですか? この機能がなければ、これtrait
はかなり役に立たないようです。
++
メソッドをオーバーライドしてIterable
、戻り値の型を に減らしたのではMap
ないでしょうか?
PS私はそれがmutableであるべきだという意味ではなくMap
、immutable.Map
.
に追加できないのはなぜscala.collection.Map
ですか? この機能がなければ、これtrait
はかなり役に立たないようです。
++
メソッドをオーバーライドしてIterable
、戻り値の型を に減らしたのではMap
ないでしょうか?
PS私はそれがmutableであるべきだという意味ではなくMap
、immutable.Map
.
質問を正しく理解していなかったため、ほとんど間違っていますが、元の回答を以下に残します。
Scala の現在のコレクション ライブラリは、おそらくソース コードでどのタイプのコレクションが使用されているかを明確にすることを期待して、ミュータブル/イミュータブルに対して異なる追加メソッドをほぼ強制しています。前述のとおり、これは 2.8 で改訂されており、その前提はなくなりつつあります。
その場合、抽象クラスはあなたが考えているメソッドを提供しません。なぜなら、それらは不変には存在するが可変には存在しない、またはその逆の可能性があるからです。または、名前は同じでも実装が異なる場合があります。
したがって、基本クラスでそれらを提供することは不可能です。
しかし、さらに、この方法では、scala.collection.map を受け取った場合、immutable を受け取ったときにそれを mutable として扱ったり、その逆を行ったりして、それを台無しにすることはできないことに注意してください。
そして、今、間違った答えのために。:)
できます (いいえ、できません。以下のコードでは 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)
Scalaコレクションライブラリは現在かなり欠陥があります。2.8(1か月かそこらでリリース予定)には、完全に刷新されたコレクションライブラリがあり、あなたが探している動作をしていると思います。
私の推測では、コレクションがあり、他の人に読み取り専用のマップファサードを提供する必要がある場合、この特性はそのままの作業に適しています。そこに追加を含めると、読み取り専用のマップインターフェイスが必要になるため、直交設計にはなりません。一方、ジェネリックインターフェイスでの++操作が必要な場合は、可変実装と不変実装の両方に適していません。たとえば、可変コレクションが追加時に自己を返した場合、インターフェイスを見ただけでは何が起こるかは明らかではありません。