字符串上迭代器的意外行为

Lui*_*hys 7 string iterator scala

任何人都可以解释为什么这些迭代器的行为不同?我通常希望String表现得像IndexedSeq[Char].这记录在哪里?

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)
Run Code Online (Sandbox Code Playgroud)

Mor*_*itz 7

在调用take它之后,无法保证迭代器的状态.

迭代器的问题是许多有用的操作只能通过引起副作用来实现.所有这些操作都具有指定的直接影响,但也可能具有无法指定的副作用(或者会使实现复杂化).

take有实现的情况下,克隆迭代器的内部状态和其他推进迭代器的实现.如果您想保证不存在副作用,则必须使用不可变数据结构,在任何其他情况下,您的代码应仅依赖于直接效果.

  • @LuigiPlinge,主干在http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/index.html#scala.collection.Iterator上有一些改进:见"考虑"这个例子用于安全和不安全的使用". (2认同)