2012-12-22 14 views
8

Tôi đang sử dụng scala 2.9.1, khi tôi thử mã này:Lỗi của mutable.Set.foreach trong 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) }) 

kết quả là cái gì đó như

0 
98 
2 
1 
4 
3 
8 

mà không liệt kê tất cả các yếu tố của một. Sau đó, trở thành Set (9, 7) thay vì thiết lập rỗng. Nó trông rất lạ đối với tôi, có phải là một lỗi hay chúng ta không thể sửa đổi bản thân thiết lập khi làm foreach?

+4

Tại sao bạn nên downvote? Tôi nghĩ rằng đó là một câu hỏi rất hợp lệ cho một người mới đến Iterator và cách họ làm việc –

+4

Tôi đã không nhìn thấy bất cứ điều gì như thế, nhưng bạn có thể thực hiện một kết quả tương tự với 'a.flatMap (x => {println (x); if (cond) Không có gì khác Một số (x)}) 'sẽ trả về một tập mới với các mục' None' đã bị xóa. – jcern

+0

Không chỉ là câu hỏi hợp lệ, nó còn sao chép http://stackoverflow.com/questions/2803085/iterators-for-mutable-collections-in-scala và http://stackoverflow.com/questions/4417994/scala-remove -in-place-all-elements-of-a-listbuffer-that-meet-a-condition và http://stackoverflow.com/questions/2500548/what-is-the-proper-way-to-remove-elements -from-a-scala-mutable-map-using-a-predi –

Trả lời

10

Bạn không thể sửa đổi bộ sưu tập khi di chuyển hoặc lặp lại bộ sưu tập đó.

Điều này giống nhau ở Scala vì nó nằm trong Java (và hầu hết các ngôn ngữ lập trình/thư viện khác). Ngoại trừ trong Java, lớp Iterator cung cấp phương thức remove có thể được sử dụng thay cho phương pháp remove của bộ sưu tập để loại bỏ các phần tử trong khi lặp lại sử dụng Iterator (nhưng sẽ vô hiệu hóa bất kỳ trình vòng lặp nào khác của bộ sưu tập đó có thể đang được sử dụng). Scala Iterators không cung cấp phương pháp như vậy.

+0

'foreach' là" di chuyển "không" lặp ". –

+0

@RexKerr Đủ công bằng. – sepp2k

+0

@ sepp2k bình luận tốt đẹp, nhưng nó không nói gì về lý do tại sao nó xuất ra một kết quả lạ như vậy (tại sao nó cho kết quả này) – xhudik

Các vấn đề liên quan