Jeśli zadzwonię pod numer toSeq
w niezmiennej kolekcji Set
, otrzymam numer ArrayBuffer
.Dlaczego toSeq Scala zmienia niezmienny zestaw w zmienny ArrayBuffer?
scala> Set(1,2,3).toSeq // returns Seq[Int] = ArrayBuffer(1, 2, 3)
To mnie zaskakuje. Biorąc pod uwagę nacisk Scala na użycie niezmiennych struktur danych, spodziewam się uzyskać niezmienną sekwencję, taką jak Vector
lub List
zamiast zmiennego ArrayBuffer
. Zwrócona kolejność elementów zestawu powinna być oczywiście nieokreślona, ale nie wydaje się, aby istniał jakiś semantyczny powód, dla którego ta kolejność również powinna być zmienna.
Generalnie spodziewam się, że operacje Scala zawsze będą generować niezmienne wyniki, chyba że wyraźnie zażądam zmiennego. To było moje założenie przez cały czas, ale jest niepoprawny tutaj i właściwie spędziłem godzinę debugując problem, w którym nieoczekiwana obecność ArrayBuffer
doprowadziła do błędu runtime w instrukcji match
. Moja poprawka miała zmienić się na Set(...).toSeq
na Set(...).toList
, ale to wygląda jak włamanie, ponieważ nie ma nic o mojej aplikacji, która w tym momencie wymaga listy.
Czy po otrzymaniu Set(...).toSeq
zwrócono obiekt zmienny na lukę w implementacji Scali, czy też jest tu zasada, której tutaj nie rozumiem?
To jest Scala 2.9.2.
stałej w 2,10 RC2: 'scala> Sek (1,2,3) .toSeq' -> 'res0 SEQ [Int] = Lista (1, 2, 3) ' – senia
@senia, miałeś na myśli' Set (1,2,3) .toSeq' zamiast 'Seq (1,2,3) .toSeq'? –
Głosuj za zmianą: [SI-6570] (https://issues.scala-lang.org/browse/SI-6570) –