Следующий элемент обхода в Rust
Метод следующего элемента двигает внутренний счет и возвращает необязательное значение. Пока счет меньше конца, в ответе лежит очередное число, иначе приходит пустой вариант, и цикл останавливается.
Опишем структуру со счетом и границей и выполним для нее трейт обхода:
struct Count {
n: i32,
end: i32,
}
impl Iterator for Count {
type Item = i32;
fn next(&mut self) -> Option<i32> {
if self.n >= self.end {
None
} else {
let v = self.n;
self.n += 1;
Some(v)
}
}
}
fn main() {
for x in Count { n: 0, end: 3 } {
println!("{}", x);
}
}
На экране три строки: 0, 1
и 2. После второго числа счет
становится равным end, и следующий
шаг уже не отдает элемент.
Тот же обход можно пройти вручную и явно обработать пустой ответ:
struct Count {
n: i32,
end: i32,
}
impl Iterator for Count {
type Item = i32;
fn next(&mut self) -> Option<i32> {
if self.n >= self.end {
None
} else {
let v = self.n;
self.n += 1;
Some(v)
}
}
}
fn main() {
let mut walk = Count { n: 0, end: 2 };
loop {
match walk.next() {
Some(v) => println!("{}", v),
None => break,
}
}
}
Дана структура:
struct Step {
cur: i32,
stop: i32,
}
Выполните трейт обхода с элементом
i32: пока cur меньше
stop, отдавайте текущее число
и увеличивайте cur. Пройдите
циклом от Step { cur: 5, stop: 8 }
и выведите три числа.
Дана структура:
struct Range {
at: i32,
top: i32,
}
Сделайте обход, который отдает at,
затем увеличивает поле на единицу, пока
at не достигнет top.
В main пройдите циклом и скажите,
сколько чисел напечатается для
Range { at: 0, top: 4 }.
Скажите, почему после последнего числа
в примере с Count цикл for
сам прекращается, хотя в main
нет отдельной проверки на пустой вариант.