Se chiamo toSeq
su una collezione immutable Set
ottengo un ArrayBuffer
.Perché toSeq di Scala converte un Set immutabile in un ArrayBuffer mutabile?
scala> Set(1,2,3).toSeq // returns Seq[Int] = ArrayBuffer(1, 2, 3)
Questo mi sorprende. Data l'enfasi di Scala sull'uso di strutture di dati immutabili, mi aspetto di ottenere una sequenza immutabile come una Vector
o List
invece di una variabile ArrayBuffer
. L'ordine restituito degli elementi dell'insieme dovrebbe ovviamente essere indefinito, ma non sembra esserci alcuna ragione semantica per cui anche questo ordine dovrebbe essere mutabile.
In generale, mi aspetto che le operazioni di Scala producano sempre risultati immutabili, a meno che non ne richieda esplicitamente una mutabile. Questa è stata la mia ipotesi da sempre, ma qui è errata, e in realtà ho appena trascorso un'ora a eseguire il debug di un problema in cui la presenza imprevista di un ArrayBuffer
ha provocato un errore di runtime in un'istruzione match
. La mia correzione era di cambiare Set(...).toSeq
a Set(...).toList
, ma questo sembra un trucco perché non c'è niente sulla mia applicazione che richiede un elenco in particolare a quel punto.
Avere Set(...).toSeq
restituisce un oggetto mutabile un difetto nell'implementazione di Scala, o c'è un principio che sto fraintendendo qui?
Questo è Scala 2.9.2.
fissato in 2.10-RC2: 'scala> Seq (1,2,3) .toSeq' ->' res0: Seq [Int] = List (1, 2, 3) ' – senia
@senia, intendevi' Set (1,2,3) .toSeq' invece di 'Seq (1,2,3) .toSeq'? –
Si prega di votare per il cambiamento: [SI-6570] (https://issues.scala-lang.org/browse/SI-6570) –