2012-12-22 10 views
8

sto usando Scala 2.9.1, quando provo questo codice:Un bug di mutable.Set.foreach in scala?

import scala.collection.mutable 
val a = mutable.Set(1,2,3,4,7,0,98,9,8) 
a.foreach(x => { println(x); a.remove(x) }) 

il risultato è stato qualcosa di simile

0 
98 
2 
1 
4 
3 
8 

che non elenca tutti gli elementi di una. Dopo questo, a diventa Set (9, 7) invece di set vuoto. Sembra molto strano per me, è un bug o semplicemente non possiamo modificare il set stesso quando si fa foreach?

+4

Perché il downvote? Penso che sia una domanda molto valida per qualcuno di nuovo per Iterators e come funzionano –

+4

Non ho visto nulla di simile, ma si potrebbe ottenere un risultato simile con 'a.flatMap (x => {println (x); if (cond) Nessun altro Some (x)}) 'che restituirà un nuovo set con gli elementi' None' rimossi. – jcern

+0

Non solo è una domanda valida, duplica http://stackoverflow.com/questions/2803085/iterators-for-mutable-collections-in-scala e http://stackoverflow.com/questions/4417994/scala-remove -in-posto-tutti-elementi-di-un-listbuffer-che-soddisfano-una-condizione e http://stackoverflow.com/questions/2500548/che-è-il-proper-way-to-remove-elements -from-a-scala-mutable-map-using-a-predi –

risposta

10

Non è possibile modificare una raccolta mentre si attraversa o si itera su di essa.

Questo è lo stesso in Scala come in Java (e nella maggior parte degli altri linguaggi/librerie di programmazione). Tranne che in Java, la classe Iterator fornisce un metodo remove che può essere usato al posto del metodo remove della raccolta per rimuovere gli elementi durante l'iterazione utilizzando tale Iterator (ma invaliderà qualsiasi altro iteratore di quella raccolta che potrebbe essere in uso). Gli Iteratori di Scala non forniscono alcun metodo.

+0

'foreach' sta" attraversando "non" iterando ". –

+0

@RexKerr Giusto abbastanza. – sepp2k

+0

@ sepp2k bel commento, ma non ha detto nulla sul motivo per cui sta emettendo un risultato così strano (perché dà questo particolare risultato) – xhudik