2013-10-18 12 views
6

Điều này có bình thường không?Lỗi trong Scala 2.10, Iterator.size?

scala> val x = Iterator(List[String]("str")) 
lol: Iterator[List[String]] = non-empty iterator 

scala> x.size 
res1: Int = 1 

scala> x.size 
res2: Int = 0 

Và thực ra tôi đang gặp phải các lỗi lạ khác .. một lỗi có thể xảy ra?

+3

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. " –

Trả lời

18

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 
6

Điều đó là bình thường. Để tìm ra kích thước của Iterator, bạn phải lặp qua nó cho đến khi nó rỗng.

Và sau đó nó trống (size == 0).

Bộ lặp sẽ được sử dụng cẩn thận vì chúng là cấu trúc dữ liệu rất dễ vỡ.

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