【问题标题】:Unexpected behaviour of iterator on StringString 上迭代器的意外行为
【发布时间】:2012-01-08 09:00:17
【问题描述】:

谁能解释为什么这些迭代器的行为不同?我通常希望字符串的行为类似于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)

【问题讨论】:

  • 似乎.take(2) 在第一个示例中复制了迭代器。

标签: string scala iterator


【解决方案1】:

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

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 2012-05-09
  • 2011-09-11
  • 1970-01-01
  • 2020-03-09
相关资源
最近更新 更多