Тип элемента своего обхода в Rust
Связанный тип трейта говорит, что именно
отдает этот обход. Для счетчика чисел
это обычно i32, для меток -
String или ссылка на строку.
Метод следующего элемента в сигнатуре
использует тот же вид в Option.
Расширим счетчик: добавим поле шага и зададим тип элемента явно:
struct Count {
n: i32,
end: i32,
step: 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 += self.step;
Some(v)
}
}
}
fn main() {
for x in Count {
n: 0,
end: 6,
step: 2,
} {
println!("{}", x);
}
}
На экране 0, 2 и 4.
Строка type Item = i32 фиксирует,
что каждый успешный шаг приносит целое
число, а не другой тип данных.
Тот же прием с коротким списком символов в поле и символом как элементом:
struct Letters {
text: String,
pos: usize,
}
impl Iterator for Letters {
type Item = char;
fn next(&mut self) -> Option<char> {
if self.pos >= self.text.len() {
None
} else {
let ch = self.text[self.pos..].chars().next()?;
self.pos += ch.len_utf8();
Some(ch)
}
}
}
fn main() {
for ch in Letters {
text: String::from("ab"),
pos: 0,
} {
println!("{}", ch);
}
}
Дана структура:
struct Tick {
value: i32,
left: u32,
}
Выполните трейт обхода: связанный тип
элемента i32, на каждом шаге
отдавайте value и уменьшайте
left, пока счетчик шагов не
станет нулем. Выведите все числа из
Tick { value: 10, left: 2 }.
Дана структура:
struct Word {
s: String,
i: usize,
}
Сделайте обход с элементом char,
который идет по символам строки s
с учетом длины символа в байтах. Напечатайте
символы слова "go".
Скажите, где в блоке выполнения трейта
обхода нужно указать связанный тип, если
метод должен отдавать Option<&str>
из поля строки.