2011-11-28 16 views
7

Bu yineleyiciler neden farklı davrandığını açıklayabilir mi? Genellikle bir String'in IndexedSeq[Char] gibi davranmasını beklerim. Bu herhangi bir yerde belgelenmiş mi? bunun üzerine take çağırmak sonraIterator'da beklenmeyen davranışı String

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

İlk örnekte .take (2) 'gibi görünüyor yineleyicinin bir kopyasını oluşturur. – ziggystar

cevap

7

Yineleyici durumu hakkında herhangi bir garanti verilmez.

Yineleyicilerdeki sorun, birçok yararlı işlemin yalnızca yan etkilere neden olarak uygulanabilmesidir. Tüm bu operasyonlar belirli bir doğrudan etkiye sahiptir, fakat aynı zamanda belirtilemeyen (veya uygulamayı zorlaştıracak) yan etkileri de olabilir.

take durumunda yineleyicinin iç durumunu ve yineleyiciyi ilerleten diğerlerini klonlayan uygulamalar vardır. Eğer yan etkilerin yokluğunu garanti etmek istiyorsanız, değişmez veri yapılarını kullanmak zorunda kalacaksınız, diğer durumlarda kodunuz sadece doğrudan etkilere dayanmalıdır.

+0

Hmm, Neden bir “yineleyicinin” tanımlanamayacağı kadar önemli bir şeyin neden önemli olduğunu merak ediyorum. –

+0

Sorunu daha iyi vurgulamak için cevabı güncelledim. – Moritz

+2

@LuigiPlinge, http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/index.html#scala.collection.Iterator adresindeki gövde bölümünde bazı iyileştirmeler yapıldı. Güvenli ve güvenli olmayan kullanım için bu örneği düşünün ". – huynhjl