Skip to content

Commit

Permalink
Translate ch08-01-vectors.md via GitLocalize
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexZzz authored and gitlocalize-app[bot] committed Jan 7, 2024
1 parent 7182932 commit 6b7a6e1
Showing 1 changed file with 8 additions and 14 deletions.
22 changes: 8 additions & 14 deletions rustbook-ru/src/ch08-01-vectors.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
## Хранение списков значений в векторах

Первым типом коллекции, который мы разберём, будет `Vec<T>`, также известный
как <em>вектор</em> (vector). Векторы позволяют хранить более одного значения
в единой структуре данных, хранящей элементы в памяти один за другим.
Векторы могут хранить данные только одного типа. Их удобно использовать,
когда нужно хранить список элементов, например, список текстовых строк из файла,
или список цен товаров в корзине покупок.
Первым типом коллекции, который мы разберём, будет `Vec<T>`, также известный как <em>вектор</em> (vector). Векторы позволяют хранить более одного значения в единой структуре данных, хранящей элементы в памяти один за другим. Векторы могут хранить данные только одного типа. Их удобно использовать, когда нужно хранить список элементов, например, список текстовых строк из файла, или список цен товаров в корзине покупок.

### Создание нового вектора

Expand All @@ -19,7 +14,7 @@

Обратите внимание, что здесь мы добавили аннотацию типа. Поскольку мы не вставляем никаких значений в этот вектор, Rust не знает, какие элементы мы собираемся хранить. Это важный момент. Векторы реализованы с использованием обобщённых типов; мы рассмотрим, как использовать обобщённые типы с вашими собственными типами в Главе 10. А пока знайте, что тип `Vec<T>`, предоставляемый стандартной библиотекой, может хранить любой тип. Когда мы создаём новый вектор для хранения конкретного типа, мы можем указать этот тип в угловых скобках. В листинге 8-1 мы сообщили Rust, что `Vec<T>` в `v` будет хранить элементы типа `i32`.

Чаще всего вы будете создавать `Vec<T>` с начальными значениями и Rust может определить тип сохраняемых вами значений, но иногда вам всё же придётся указывать аннотацию типа. Для удобства Rust предоставляет макрос `vec!`, который создаст новый вектор, содержащий заданные вами значения. В листинге 8-2 создаётся новый `Vec<i32>`, который будет хранить значения `1`, `2` и `3`. Целочисленный тип — i32, потому что это целочисленный тип по умолчанию, как мы обсуждали в разделе «Типы данных» главы 3. Числовым типом является `i32`, потому что это тип по умолчанию для целочисленных значений, о чём упоминалось в разделе [“Типы данных”][data-types] Главы 3.
Чаще всего вы будете создавать `Vec<T>` с начальными значениями и Rust может определить тип сохраняемых вами значений, но иногда вам всё же придётся указывать аннотацию типа. Для удобства Rust предоставляет макрос `vec!`, который создаст новый вектор, содержащий заданные вами значения. В листинге 8-2 создаётся новый `Vec<i32>`, который будет хранить значения `1`, `2` и `3`. Числовым типом является `i32`, потому что это тип по умолчанию для целочисленных значений, о чём упоминалось в разделе [“Типы данных”] Главы 3.

```rust
{{#rustdoc_include ../listings/ch08-common-collections/listing-08-02/src/main.rs:here}}
Expand Down Expand Up @@ -83,7 +78,7 @@

Код в листинге 8-6 может выглядеть так, как будто он должен работать. Почему ссылка на первый элемент должна заботиться об изменениях в конце вектора? Эта ошибка возникает из-за особенности того, как работают векторы: поскольку векторы размещают значения в памяти друг за другом, добавление нового элемента в конец вектора может потребовать выделения новой памяти и копирования старых элементов в новое пространство, если нет достаточного места, чтобы разместить все элементы друг за другом там, где в данный момент хранится вектор. В этом случае ссылка на первый элемент будет указывать на освобождённую память. Правила заимствования предотвращают попадание программ в такую ситуацию.

> Примечание: Дополнительные сведения о реализации типа `Vec<T>` смотрите в разделе ["The Rustonomicon"][nomicon].
> Примечание: Дополнительные сведения о реализации типа `Vec<T>` смотрите в разделе ["The Rustonomicon"](https://doc.rust-lang.org/nomicon/vec/vec.html).
### Перебор значений в векторе

Expand All @@ -103,7 +98,7 @@

<span class="caption">Листинг 8-8. Итерирование и изменение элементов вектора по изменяемым ссылкам</span>

Чтобы изменить значение на которое ссылается изменяемая ссылка, мы должны использовать оператор разыменования ссылки `*` для получения значения по ссылке в переменной `i` прежде чем использовать оператор `+=`. Мы поговорим подробнее об операторе разыменования в разделе [“Следование по указателю к значению с помощью оператора разыменования”][deref] Главы 15.
Чтобы изменить значение на которое ссылается изменяемая ссылка, мы должны использовать оператор разыменования ссылки `*` для получения значения по ссылке в переменной `i` прежде чем использовать оператор `+=`. Мы поговорим подробнее об операторе разыменования в разделе [“Следование по указателю к значению с помощью оператора разыменования”] Главы 15.

Перебор вектора, будь то неизменяемый или изменяемый, безопасен из-за правил проверки заимствования. Если бы мы попытались вставить или удалить элементы в телах цикла `for` в листингах 8-7 и 8-8, мы бы получили ошибку компилятора, подобную той, которую мы получили с кодом в листинге 8-6. Ссылка на вектор, содержащийся в цикле for, предотвращает одновременную модификацию всего вектора.

Expand All @@ -123,7 +118,7 @@ Rust должен знать, какие типы будут в векторе

Если вы не знаете исчерпывающий набор типов, которые программа получит во время выполнения для хранения в векторе, то техника использования перечисления не сработает. Вместо этого вы можете использовать типаж-объект, который мы рассмотрим в главе 17.

Теперь, когда мы обсудили некоторые из наиболее распространённых способов использования векторов, обязательно ознакомьтесь [с документацией по API вектора][vec-api], чтобы узнать о множестве полезных методов, определённых в `Vec<T>` стандартной библиотеки. Например, в дополнение к методу `push`, существует метод `pop`, который удаляет и возвращает последний элемент.
Теперь, когда мы обсудили некоторые из наиболее распространённых способов использования векторов, обязательно ознакомьтесь [с документацией по API вектора](https://doc.rust-lang.org/std/vec/struct.Vec.html), чтобы узнать о множестве полезных методов, определённых в `Vec<T>` стандартной библиотеки. Например, в дополнение к методу `push`, существует метод `pop`, который удаляет и возвращает последний элемент.

### Удаление элементов из вектора

Expand All @@ -139,7 +134,6 @@ Rust должен знать, какие типы будут в векторе

Давайте перейдём к следующему типу коллекции: `String`!

[data-types]: ch03-02-data-types.html#data-types
[nomicon]: https://doc.rust-lang.org/nomicon/vec/vec.html
[vec-api]: https://doc.rust-lang.org/std/vec/struct.Vec.html
[deref]: ch15-02-deref.html#following-the-pointer-to-the-value-with-the-dereference-operator

[“Типы данных”]: ch03-02-data-types.html#data-types
[“Следование по указателю к значению с помощью оператора разыменования”]: ch15-02-deref.html#following-the-pointer-to-the-value-with-the-dereference-operator

0 comments on commit 6b7a6e1

Please sign in to comment.