Skip to content

Commit

Permalink
Translate ch13-01-closures.md via GitLocalize
Browse files Browse the repository at this point in the history
  • Loading branch information
jashka34 authored and gitlocalize-app[bot] committed Dec 10, 2023
1 parent f6b117f commit 1463185
Showing 1 changed file with 4 additions and 6 deletions.
10 changes: 4 additions & 6 deletions rustbook-ru/src/ch13-01-closures.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ let add_one_v4 = |x| x + 1 ;

Эта техника в основном полезна при передаче замыкания новому потоку, чтобы переместить данные так, чтобы они принадлежали новому потоку. Мы подробно обсудим потоки и то, зачем их использовать, в главе 16, когда будем говорить о параллелизме, а пока давайте вкратце рассмотрим порождение нового потока с помощью замыкания, в котором используется ключевое слово `move`. В листинге 13-6 показан код из листинга 13-4, модифицированный для печати вектора в новом потоке, а не в основном потоке:

<span class="filename">Файл: src/main.rs</span>
<span class="filename">Filename: src/main.rs</span>

```rust
{{#rustdoc_include ../listings/ch13-functional-features/listing-13-06/src/main.rs}}
Expand Down Expand Up @@ -181,7 +181,7 @@ impl<T> Option<T> {
Теперь рассмотрим метод стандартной библиотеки `sort_by_key`, определённый у срезов, чтобы увидеть, чем он отличается от `unwrap_or_else` и почему `sort_by_key` использует `FnMut` вместо `FnOnce` для ограничения трейта. Замыкание принимает единственный аргумент в виде ссылки на текущий элемент в рассматриваемом срезе и возвращает значение типа `K`, к которому применима сортировка. Эта функция полезна, когда вы хотите отсортировать срез по определённому атрибуту каждого элемента. В листинге 13-7 у нас есть список экземпляров `Rectangle`, и мы используем `sort_by_key`, чтобы упорядочить их по атрибуту `width` от меньшего к большему:

<span class="filename">Файл: src/main.rs</span>
<span class="filename">Filename: src/main.rs</span>

```rust
{{#rustdoc_include ../listings/ch13-functional-features/listing-13-07/src/main.rs}}
Expand All @@ -199,7 +199,7 @@ impl<T> Option<T> {

И наоборот, в листинге 13-8 показан пример замыкания, которое реализует только признак `FnOnce`, потому что оно перемещает значение из среды. Компилятор не позволит нам использовать это замыкание с `sort_by_key`:

<span class="filename">Файл: src/main.rs</span>
<span class="filename">Файл : src/main.rs</span>

```rust,ignore,does_not_compile
{{#rustdoc_include ../listings/ch13-functional-features/listing-13-08/src/main.rs}}
Expand All @@ -215,7 +215,7 @@ impl<T> Option<T> {

Ошибка указывает на строку в теле замыкания, которая перемещает `value` из окружения. Чтобы исправить это, нужно изменить тело замыкания так, чтобы оно не перемещало значения из окружения. Для подсчёта количества вызовов `sort_by_key` более простым способом является хранение счётчика в окружении и увеличение его значения в теле замыкания. Замыкание в листинге 13-9 работает с `sort_by_key`, поскольку оно фиксирует только изменяемую ссылку на счётчик `num_sort_operations` и поэтому может быть вызвано более одного раза:

<span class="filename">Файл: src/main.rs</span>
<span class="filename">Файл : src/main.rs</span>

```rust
{{#rustdoc_include ../listings/ch13-functional-features/listing-13-09/src/main.rs}}
Expand All @@ -224,5 +224,3 @@ impl<T> Option<T> {
<span class="caption">Листинг 13-9: Использование замыкания <code>FnMut</code> с <code>sort_by_key</code> разрешено</span>

Трейты `Fn` важны при определении или использовании функций или типов, использующих замыкания. В следующем разделе мы обсудим итераторы. Многие методы итераторов принимают аргументы в виде замыканий, поэтому не забывайте об этих деталях, пока мы продвигаемся дальше!


0 comments on commit 1463185

Please sign in to comment.