如果我在不可變的Set
集合上調用toSeq
,我會得到一個ArrayBuffer
。爲什麼Scala的toSeq將一個不可變的Set轉換爲一個可變的ArrayBuffer?
scala> Set(1,2,3).toSeq // returns Seq[Int] = ArrayBuffer(1, 2, 3)
這令我感到奇怪。鑑於Scala強調使用不可變數據結構,我期望獲得不變的序列,如Vector
或List
而不是可變的ArrayBuffer
。返回的集合元素的順序當然應該是未定義的,但似乎沒有任何語義上的原因,爲什麼該順序也應該是可變的。
在一般情況下,我希望斯卡拉操作總是產生不可變的結果,除非我明確要求一個可變的一個。這一直是我的假設,但這是一個不正確的,我實際上花了一個小時調試一個問題,其中ArrayBuffer
的意外存在導致match
語句中的運行時錯誤。我的修補程序是將Set(...).toSeq
更改爲Set(...).toList
,但這種感覺像是黑客,因爲我的應用程序沒有任何特別需要列表的地方。
是具有Set(...).toSeq
返回可變對象的一個漏洞在Scala的實現,或者是有我在這裏誤解原則?
這是斯卡拉2.9.2。
固定在2.10-RC2:'階> SEQ(1,2,3).toSeq' - >'RES0:序號[INT] =列表(1,2,3) ' – senia
@senia,你的意思是設置(1,2,3).toSeq而不是'Seq(1,2,3).toSeq'? –
請投票修改:[SI-6570](https://issues.scala-lang.org/browse/SI-6570) –