Я изо всех сил пытаюсь превратить простую рекурсивную функцию в простой итератор. Проблема в том, что рекурсивная функция поддерживает состояние в своих локальных переменных и стеке вызовов - и чтобы превратить это в итератор ржавчины, означает в основном экстернализацию всего состояния функции в изменяемые свойства в некоторой настраиваемой структуре итератора. Это довольно неприятное занятие.
В таких языках, как javascript или python, yield
приходит на помощь. Есть ли в Rust какие-нибудь методы, которые помогут справиться с этой сложностью?
Простой пример с использованием yield
(псевдокод):
function one_level(state, depth, max_depth) {
if depth == max_depth {
return
}
for s in next_states_from(state) {
yield state_to_value(s);
yield one_level(s, depth+1, max_depth);
}
}
Чтобы сделать что-то подобное в Rust, я в основном создаю a Vec<Vec<State>>
в моей структуре итератора, чтобы отразить данные, возвращаемые next_states_from
на каждом уровне стека вызовов. Затем при каждом вызове next()
аккуратно вытаскивайте из него кусочки, чтобы восстановить состояние. Кажется, я чего-то упускаю.