2011-11-28 34 views
7

Có ai giải thích tại sao các trình vòng lặp này hoạt động khác nhau không? Tôi thường mong đợi một Chuỗi hoạt động như một số IndexedSeq[Char]. Tài liệu này có ở bất kỳ đâu không?Hành vi không mong muốn của trình lặp trên chuỗi

val si: Iterator[Char] = "uvwxyz".iterator 
val vi: Iterator[Char] = "uvwxyz".toIndexedSeq.iterator 

val sr = for (i <- 1 to 3) 
      yield si take 2 mkString 
    //sr: scala.collection.immutable.IndexedSeq[String] = Vector(uv, uv, uv) 

val vr = for (i <- 1 to 3) 
      yield vi take 2 mkString 
    //vr: scala.collection.immutable.IndexedSeq[String] = Vector(uv, wx, yz) 
+0

Có vẻ như '.take (2)' trong ví dụ đầu tiên tạo một bản sao của trình lặp. – ziggystar

Trả lời

7

Không có gì đảm bảo về trạng thái của trình lặp sau khi bạn gọi take trên đó.

Vấn đề với vòng lặp là nhiều thao tác hữu ích chỉ có thể được thực hiện bằng cách gây ra các tác dụng phụ. Tất cả các hoạt động này có hiệu ứng trực tiếp xác định nhưng cũng có thể có các tác dụng phụ không thể được chỉ định (hoặc sẽ làm phức tạp việc thực hiện).

Trong trường hợp take, có các triển khai sao chép trạng thái nội bộ của trình lặp và những người khác nâng cao trình lặp. Nếu bạn muốn đảm bảo sự vắng mặt của các hiệu ứng phụ, bạn sẽ phải sử dụng các cấu trúc dữ liệu bất biến, trong bất kỳ trường hợp nào khác, mã của bạn chỉ nên dựa vào các hiệu ứng trực tiếp.

+0

Hmm, tôi tự hỏi tại sao một cái gì đó quan trọng đến mức quan trọng đối với những gì một 'Iterator' sẽ không được chỉ định? –

+0

Tôi đã cập nhật câu trả lời để làm nổi bật vấn đề tốt hơn. – Moritz

+2

@LuigiPlinge, có một số cải tiến trong thân cây tại http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/index.html#scala.collection.Iterator: xem sau " Hãy xem xét ví dụ này để sử dụng an toàn và không an toàn ". – huynhjl

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