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

时间:2011-11-28 23:08:12

标签: string scala iterator

任何人都可以解释为什么这些迭代器的行为不同?我通常希望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)

1 个答案:

答案 0 :(得分:7)

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

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

take的情况下,有一些实现可以克隆迭代器的内部状态,而其他实现可以克隆迭代器。如果你想保证没有副作用,你将不得不使用不可变数据结构,在任何其他情况下,你的代码应该只依赖于直接效果。