Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 字符串上迭代器的意外行为_String_Scala_Iterator - Fatal编程技术网

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

String 字符串上迭代器的意外行为,string,scala,iterator,String,Scala,Iterator,有人能解释为什么这些迭代器的行为不同吗?我通常希望字符串的行为类似于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

有人能解释为什么这些迭代器的行为不同吗?我通常希望字符串的行为类似于
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)
val-si:Iterator[Char]=“uvwxyz”。迭代器
val vi:Iterator[Char]=“uvwxyz”.toIndexedSeq.Iterator

val sr=for(i调用
take
后,无法保证迭代器的状态

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


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

看起来像
。take(2)
在第一个示例中,我们复制了迭代器。嗯,我想知道为什么对
迭代器的功能如此重要的东西会被未指定?@LuigiPlinge,trunk中有一些改进,请参见“考虑此示例的安全和不安全使用”。