2012-12-22 27 views
8

:Scala'da mutable.Set.foreach bir hata? Bu kodu denediğimde, scala 2.9.1 kullanıyorum

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) }) 

sonucu bir tüm unsurları listelemedi

0 
98 
2 
1 
4 
3 
8 

gibi bir şey oldu. Bundan sonra, boş set yerine Set (9, 7) olur. Bana çok garip geliyor, bu bir hata mı yoksa foreach yaparken setin kendisini değiştiremeyiz mi?

+4

Neden düşüş yok? Iteratörler için yeni bir kişi için çok geçerli bir soru ve nasıl çalıştığını düşünüyorum –

+4

Ben böyle bir şey görmedim, ama benzer bir sonuç elde edebilirsiniz "a.flatMap (x => {println (x); if (cond) Hiçbiri Başka (x)}) '' Yok 'öğeleri ile yeni bir set döndürecektir. – jcern

+0

Sadece geçerli bir soru değil, http://stackoverflow.com/questions/2803085/iterators-for-mutable-collections-in-scala ve http://stackoverflow.com/questions/4417994/scala-remove adreslerini çoğaltır. -in-yer-hepsi-elemanları-bir-listbuffer-bu-karşılamak-bir-durumu ve http://stackoverflow.com/questions/2500548/what-is-the-proper-way-to-remove-elements -den-a-scala-değiştirilebilen harita-kullanarak-a-predi –

cevap

10

Bir koleksiyon üzerinde geçiş yaparken veya üzerinde yineleme yaparken değiştiremezsiniz.

Bu, Java'da olduğu gibi Scala'da da (ve diğer programlama dillerinde/kitaplıklarında) aynıdır. Bunun dışında, Java'da Iterator sınıfı, Iterator'u kullanarak yinelenirken öğeleri kaldırmak için koleksiyonun remove yönteminin yerine kullanılabilen remove yöntemini sağlar (ancak bu koleksiyonun diğer yineleyicileri geçersiz kılar). Scala Yineleyiciler böyle bir yöntem sağlamaz.

+0

"foreach", "geçiş" değil "yinelenen" dir. –

+0

@RexKerr Yeterince adil. – sepp2k

+0

@ sepp2k güzel yorum, ama neden böyle garip bir sonuç çıkarıyor neden hakkında hiçbir şey söylemedi (neden bu özel sonuç verir) – xhudik