Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Translate iter.md via GitLocalize #464

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 27 additions & 25 deletions rust-by-example-ru/src/trait/iter.md
Original file line number Diff line number Diff line change
@@ -1,44 +1,42 @@
# Итераторы

Типаж [`Iterator`](https://doc.rust-lang.org/core/iter/trait.Iterator.html) используется для итерирования
по коллекциям, таким как массивы.
Типаж [`Iterator`] используется для итерирования по коллекциям, таким как массивы.

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

Для удобства использования, например в цикле `for`, некоторые коллекции
превращаются в итераторы с помощью метода [`.into_iterator()`](https://doc.rust-lang.org/std/iter/trait.IntoIterator.html).
Для удобства использования, например в цикле `for`, некоторые коллекции превращаются в итераторы с помощью метода [`.into_iterator()`].

```rust,editable
struct Fibonacci {
curr: u32,
next: u32,
}

// Реализация `Iterator` для `Fibonacci`.
// Для реализации типажа `Iterator` требуется реализовать метод `next`.
// Реализуем `Iterator` для `Fibonacci`.
// Для реализации типажа `Iterator` требуется реализовать только метод `next.
impl Iterator for Fibonacci {
// Мы можем ссылаться на этот тип, используя Self::Item
type Item = u32;

// Здесь мы определяем последовательность, используя `.curr` и `.next`.
// Возвращаем тип `Option<T>`:
// * Когда в `Iterator` больше нет значений, будет возвращено `None`.
// Возвращаем тип `Option`:
// * WКогда в `Iterator` больше нет значений, будет возвращено `None`.
// * В противном случае следующее значение оборачивается в `Some` и возвращается.
fn next(&mut self) -> Option<u32> {
let new_next = self.curr + self.next;
// Мы используем Self::Item в указании возвращаемого типа, поэтому мы можем изменить
// тип, не меняя сигнатуры функций.
fn next(&mut self) -> Option<Self::Item> {
let current = self.curr;

self.curr = self.next;
self.next = new_next;
self.next = current + self.next;

// Поскольку последовательность Фибоначчи бесконечна,
// то `Iterator` никогда не вернет `None`, и всегда будет
// возвращаться `Some`.
Some(self.curr)
// Поскольку последовательность Фибоначчи бесконечна, `Iterator`
// никогда не вернёт `None`, всегда возвращая `Some`.
Some(current)
}
}

// Возвращается генератор последовательности Фибоначчи.
// Возвращает генератор последовательности Фибоначчи.
fn fibonacci() -> Fibonacci {
Fibonacci { curr: 0, next: 1 }
}
Expand All @@ -47,20 +45,20 @@ fn main() {
// `0..3` это `Iterator`, который генерирует : 0, 1, и 2.
let mut sequence = 0..3;

println!("Четыре подряд вызова `next`на 0..3");
println!("Четыре последовательных вызова `next` на 0..3");
println!("> {:?}", sequence.next());
println!("> {:?}", sequence.next());
println!("> {:?}", sequence.next());
println!("> {:?}", sequence.next());

// `for` работает через `Iterator` пока тот не вернет `None`.
// каждое значение `Some` распаковывается и привязывается к переменной (здесь это `i`).
// `for` продолжает работу, пока `Iterator` не вернёт `None`.
// Каждое значение `Some` распаковывается и привязывается к переменной (здесь это `i`).
println!("Итерирование по 0..3 используя `for`");
for i in 0..3 {
println!("> {}", i);
}

// Метод `take(n)` уменьшает `Iterator` до его первых `n` членов.
// The `take(n)` Метод `take(n)` ограничивает `Iterator` до его первых `n` членов.
println!("Первые четыре члена последовательности Фибоначчи: ");
for i in fibonacci().take(4) {
println!("> {}", i);
Expand All @@ -74,10 +72,14 @@ fn main() {

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

// Метод `iter` превращает `Iterator` в массив/срез.
// Метод `iter` выдаёт `Iterator` для массива или среза.
println!("Итерирование по массиву {:?}", &array);
for i in array.iter() {
println!("> {}", i);
}
}
```


[`.into_iterator()`]: https://doc.rust-lang.org/std/iter/trait.IntoIterator.html
[`Iterator`]: https://doc.rust-lang.org/core/iter/trait.Iterator.html
Loading