Читаем Rust на примерах полностью

Типаж требует определить метод next, для получения следующего элемента. Данный метод в блоке impl может быть определён вручную или автоматически (как в массивах и диапазонах).

Для удобства использования, например в цикле for, некоторые коллекции превращаются в итераторы с помощью метода .into_iterator().

struct Fibonacci {

curr: u32,

next: u32,

}

// Реализация `Iterator` для `Fibonacci`.

// Для реализации типажа `Iterator` требуется реализовать метод `next`.

impl Iterator for Fibonacci {

type Item = u32;

// Здесь мы определяем последовательность, используя `.curr` и `.next`.

// Возвращаем тип `Option`:

// * Когда в `Iterator` больше нет значений, будет возвращено `None`.

// * В противном случае следующее значение оборачивается в `Some` и возвращается.

fn next(&mut self) -> Option {

let new_next = self.curr + self.next;

self.curr = self.next;

self.next = new_next;

// Поскольку последовательность Фибоначчи бесконечна,

// то `Iterator` никогда не вернет `None`, и всегда будет

// возвращаться `Some`.

Some(self.curr)

}

}

// Возвращается генератор последовательности Фибоначчи.

fn fibonacci() -> Fibonacci {

Fibonacci { curr: 0, next: 1 }

}

fn main() {

// `0..3` это `Iterator`, который генерирует : 0, 1, и 2.

let mut sequence = 0..3;

println!("Четыре подряд вызова `next`на 0..3");

println!("> {:?}", sequence.next());

println!("> {:?}", sequence.next());

println!("> {:?}", sequence.next());

println!("> {:?}", sequence.next());

// `for` работает через `Iterator` пока тот не вернет `None`.

// каждое значение `Some` распаковывается и привязывается к переменной (здесь это `i`).

println!("Итерирование по 0..3 используя `for`");

for i in 0..3 {

println!("> {}", i);

}

// Метод `take(n)` уменьшает `Iterator` до его первых `n` членов.

println!("Первые четыре члена последовательности Фибоначчи: ");

for i in fibonacci().take(4) {

println!("> {}", i);

}

// Метод `skip(n)` сокращает `Iterator`, отбрасывая его первые `n` членов.

println!("Следующие четыре члена последовательности Фибоначчи: ");

for i in fibonacci().skip(4).take(4) {

println!("> {}", i);

}

let array = [1u32, 3, 3, 7];

// Метод `iter` превращает `Iterator` в массив/срез.

println!("Итерирование по массиву {:?}", &array);

for i in array.iter() {

println!("> {}", i);

}

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

Перейти на страницу:

Похожие книги

Компьютерные сети. 6-е изд.
Компьютерные сети. 6-е изд.

Перед вами шестое издание самой авторитетной книги по современным сетевым технологиям, написанное признанным экспертом Эндрю Таненбаумом в соавторстве со специалистом компании Google Дэвидом Уэзероллом и профессором Чикагского университета Ником Фимстером. Первая версия этого классического труда появилась на свет в далеком 1980 году, и с тех пор каждое издание книги неизменно становилось бестселлером. В книге последовательно изложены основные концепции, определяющие современное состояние компьютерных сетей и тенденции их развития. Авторы подробно объясняют устройство и принципы работы аппаратного и программного обеспечения, рассматривают все аспекты и уровни организации сетей — от физического до прикладного. Изложение теоретических принципов дополняется яркими, показательными примерами функционирования интернета и компьютерных сетей различного типа. Большое внимание уделяется сетевой безопасности. Шестое издание полностью переработано с учетом изменений, произошедших в сфере сетевых технологий за последние годы, и, в частности, освещает такие технологии, как DOCSIS, 4G и 5G, беспроводные сети стандарта 802.11ax, 100-гигабитные сети Ethernet, интернет вещей, современные транспортные протоколы CUBIC TCP, QUIC и BBR, программно-конфигурируемые сети и многое другое.

Дэвид Уэзеролл , Ник Фимстер , Эндрю Таненбаум

Учебные пособия, самоучители