Подтвердить что ты не робот

Можно использовать цикл while с выходом в scala

Вот стандартный формат для for/yield в scala: обратите внимание, что он ожидает коллекцию, элементы которой управляют итерацией.

for (blah <- blahs) yield someThingDependentOnBlah

У меня есть ситуация, когда неопределенное количество итераций будет происходить в цикле. Логика внутреннего цикла определяет, сколько будет выполнено.

while (condition) { some logic that affects the triggering condition } yield blah

Каждая итерация будет генерировать один элемент последовательности - точно так же, как запрограммирован выход. Каков рекомендуемый способ сделать это?

4b9b3361

Ответ 1

Вы можете

Iterator.continually{ some logic; blah }.takeWhile(condition)

чтобы получить почти то же самое. Вам нужно будет использовать что-то изменяемое (например, var) для логики, чтобы повлиять на условие. В противном случае вы можете

Iterator.iterate((blah, whatever)){ case (_,w) => (blah, some logic on w) }.
         takeWhile(condition on _._2).
         map(_._1)

Ответ 2

Использование для понимания - неправильная вещь для этого. То, что вы описываете, обычно выполняется с помощью unfold, хотя этот метод отсутствует в стандартной библиотеке Scala. Однако вы можете найти его в Scalaсе.

Ответ 3

Другой способ, аналогичный предложению @rexkerr:

 blahs.toIterator.map{ do something }.takeWhile(condition)

Это кажется немного более естественным, чем Iterator.continually