Неожиданное поведение итератора в строке - PullRequest
7 голосов
/ 29 ноября 2011

Может кто-нибудь объяснить, почему эти итераторы ведут себя по-разному?Я обычно ожидаю, что строка будет вести себя как 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 Ответ

7 голосов
/ 29 ноября 2011

Нет никаких гарантий относительно состояния итератора после того, как вы вызовете take для него.

Проблема с итераторами заключается в том, что многие полезные операции могут быть реализованы только при возникновении побочных эффектов. Все эти операции имеют указанный прямой эффект, но могут также иметь побочные эффекты, которые не могут быть указаны (или могут усложнить реализацию).

В случае take существуют реализации, которые клонируют внутреннее состояние итератора, и другие, которые продвигают итератор. Если вы хотите гарантировать отсутствие побочных эффектов, вам придется использовать неизменяемые структуры данных, в любом другом случае ваш код должен полагаться только на прямые эффекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...