Перебор функции в Go
В цикл можно отдать функцию, которая сама вызывает переданный ей шаг. Такую функцию называют итератором: она получает шаг с одним значением и возвращает признак, нужно ли продолжать.
Сигнатура итератора для целых чисел выглядит
как функция, принимающая шаг yield
типа func(int) bool. Пока шаг возвращает
истину, итератор зовет его снова с очередным
числом. Ложный ответ останавливает перебор.
На экране по строке 1, 2 и 3.
Внешняя запись возвращает функцию шага, а
цикл перебора сам создает yield и
передает его итератору.
Напишем короткую последовательность из трех чисел и выведем ее через цикл:
package main
import "fmt"
func Three() func(func(int) bool) {
return func(yield func(int) bool) {
if !yield(1) {
return
}
if !yield(2) {
return
}
if !yield(3) {
return
}
}
}
func main() {
for n := range Three() {
fmt.Println(n)
}
}
Дано число:
n := 0
Опишите итератор на три целых 10,
20 и 30 и выведите их через
цикл перебора.
Дан следующий код:
func One() func(func(int) bool) {
return func(yield func(int) bool) {
yield(7)
}
}
Скажите, сколько строк выведет цикл перебора этой последовательности.
Дан следующий фрагмент итератора:
return func(yield func(int) bool) {
if !yield(5) {
return
}
yield(6)
}
Скажите, вызовется ли шаг со значением
6, если шаг для 5 вернет ложь.