toSeq
不変のSet
コレクションを呼び出すと、 ArrayBuffer
.
scala> Set(1,2,3).toSeq // returns Seq[Int] = ArrayBuffer(1, 2, 3)
これは私を驚かせます。Scala が不変のデータ構造を使用することに重点を置いていることを考えると、 mutable の代わりにVector
orのような不変のシーケンスが返されることを期待しています。セット要素の返される順序はもちろん未定義である必要がありますが、その順序も変更可能にする意味的な理由はないようです。List
ArrayBuffer
一般に、変更可能な結果を明示的に要求しない限り、Scala 操作は常に不変の結果を生成することを期待しています。これはずっと私の仮定でしたが、ここでは正しくありません。実際には、予期しない の存在によってステートメントArrayBuffer
で実行時エラーが発生するという問題をデバッグするのに 1 時間費やしました。match
私の修正は に変更Set(...).toSeq
することSet(...).toList
でしたが、その時点で特にリストを必要とするアプリケーションが何もないため、これはハックのように感じます。
可変オブジェクトをSet(...).toSeq
返すことは Scala の実装の欠陥ですか、それとも私がここで誤解している原則はありますか?
これは Scala 2.9.2 です。