Останов итератора из цикла в Go
Выход из цикла останавливает и сам итератор,
если он проверяет ответ шага. Команда
прерывания внутри range сообщает
рантайму, что перебор больше не нужен,
и следующий вызов yield получает
ложь.
Итератор, который после каждого значения
смотрит на результат yield, обрывает
работу и не зовет шаг снова. Без такой
проверки цикл формально мог бы попросить
еще элементы, но типичная запись с
if !yield(v) { return } связывает
выход из range с остановкой
последовательности.
На экране только 5 и 4. После
break итератор не дойдет до 3,
хотя внутренний цикл еще мог бы продолжаться.
Обратный счет прервем после первых двух чисел:
package main
import "fmt"
func CountDown(n int) func(func(int) bool) {
return func(yield func(int) bool) {
for i := n; i > 0; i-- {
if !yield(i) {
return
}
}
}
}
func main() {
for v := range CountDown(5) {
fmt.Println(v)
if v == 4 {
break
}
}
}
Дан следующий код:
for v := range CountDown(6) {
fmt.Println(v)
if v == 3 {
break
}
}
Перечислите значения v, которые успеют
напечататься.
Дан следующий фрагмент итератора:
for i := 1; i <= 10; i++ {
if !yield(i) {
return
}
}
Скажите, что произойдет с циклом перебора,
если в теле range сработает
break на значении 4.
Дано число:
top := 8
Переберите обратный счет до top и
остановите цикл, как только напечатаете
3 значения.