Không, đó không phải là lỗi. Đó là hành vi bình thường.
Iterators là những thứ có thể thay đổi. Bạn có thể nghĩ chúng như con trỏ. Mỗi lần bạn hỏi một trình lặp để cung cấp cho bạn phần tử tiếp theo mà nó trỏ đến nó sẽ di chuyển thêm một vị trí nữa.
Khi bạn yêu cầu nó cung cấp cho bạn kích thước nó sẽ đi qua từng phần tử trong chuỗi nó trỏ đến, di chuyển mỗi lần một vị trí sang phải. Khi không có thêm phần tử nào để đi qua iterator.hasNext == false
, nó sẽ trả về kích thước. Nhưng sau đó nó sẽ cạn kiệt tất cả các yếu tố. Khi có cuộc gọi mới để size
được thực hiện, các iterator đã được đặt ở vị trí cuối cùng, vì vậy nó sẽ ngay lập tức trở 0.
Để hiểu rõ hơn về những gì đang xảy ra, bạn có thể làm điều này:
val it = Iterator(1, 2, 3, 4)
//it: >1 2 3 4
it.next() //ask for the next element
//it: 1 >2 3 4
it.next()
//it: 1 2 >3 4
println(it.size) // prints 2
//it: 1 2 3 4 >
println(it.size) // prints 0
Nguồn
2013-10-18 20:11:54
Từ http://www.scala-lang.org/api/current/#scala.collection.Iterator "Điều đặc biệt quan trọng cần lưu ý là, trừ khi có quy định khác, * người ta không bao giờ nên sử dụng một trình lặp sau khi gọi một phương thức trên nó. ngoại lệ quan trọng nhất cũng là phương pháp trừu tượng duy nhất: tiếp theo và hasNext. " –