Skip to content

Commit

Permalink
Merge pull request #871 from aleksandr-shevchenko/ch07-02
Browse files Browse the repository at this point in the history
fix ch07-02
  • Loading branch information
funkill authored Jun 28, 2022
2 parents c812e17 + 4dac795 commit a557dd8
Showing 1 changed file with 61 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,66 @@
## Определение модулей для контроля видимости и конфиденциальности

В этом разделе мы поговорим о модулях и других частях системы модулей, а именно: *путях*(paths), которые позволяют именовать элементы; ключевом слове `use`, которое приносит путь в область видимости; ключевом слове `pub`, которое делает элементы общедоступными. Мы также обсудим ключевое слово `as`, внешние пакеты и оператор glob. А пока давайте сосредоточимся на модулях!
В этом разделе мы поговорим о модулях и других частях системы модулей, а именно: о *путях*, которые позволяют именовать элементы; о ключевом слове `use`, которое приносит путь в область видимости; и о ключевом слове `pub`, которое делает элементы общедоступными. Мы также обсудим ключевое слово `as`, внешние пакеты и оператор glob.

*Модули* позволяют организовывать код внутри крейта по группам для удобства чтения и простого повторного использования. Модули также контролируют *конфиденциальность* (privacy) элементов: определяют может элемент использоваться внешним кодом, быть *публичным (public)* или является деталями внутренней реализации и недоступен для внешнего использования, т.е. является *приватным (private)*.
Сначала мы начнём со списка правил, чтобы вам было легче ориентироваться при организации кода в будущем. Затем мы подробно объясним каждое из правил.

### Шпаргалка по модулям

Здесь мы дадим краткий обзор того, как модули, пути, ключевые слова `use` и `pub` работают в компиляторе, и как большинство разработчиков организуют свой код. В этой главе мы рассмотрим примеры каждого из этих правил, но это прекрасное место для напоминания о том, как работают модули.

- **Начинаем с корня крейта**: При компиляции крейта, компилятор ищет файл корня крейта (обычно это *src/lib.rs* для библиотечного крейта или *src/main.rs* для бинарного крейта) для компиляции кода.
- **Объявление модулей**: В файле корня крейта, вы можете объявить новые модули; скажем, вы объявляете модуль “garden” с помощью `mod garden;`. Компилятор будет искать код модуля в следующих местах:
- в этом же файле, между фигурных скобок, которые заменяют точку с запятой после `mod garden`;
- в файле *src/garden.rs*;
- в файле *src/garden/mod.rs*.
- **Объявление подмодулей**: В любом файле, кроме корня крейта, вы можете объявить подмодули. К примеру, вы можете объявить `mod vegetables;` в *src/garden.rs*. Компилятор будет искать код подмодуля в каталоге с именем родительского модуля в следующих местах:
- в этом же файле, сразу после `mod vegetables`, между фигурных скобок, которые заменяют точку с запятой;
- в файле *src/garden/vegetables.rs*;
- в файле *src/garden/vegetables/mod.rs*.
- **Пути к коду в модулях**: После того, как модуль станет частью вашего крейта и если допускают правила конфиденциальности, вы можете ссылаться на код в этом модуле из любого места в вашего крейте, используя путь к коду. Например, тип `Asparagus` в подмодуле `vegetables` будет найден по пути `crate::garden::vegetables::Asparagus`.
- **Скрытие или общедоступность**: Код в модуле по умолчанию скрыт от родительского модуля. Чтобы сделать модуль общедоступным, объявите его как `pub mod` вместо `mod`. Чтобы сделать элементы общедоступного модуля тоже общедоступными, используйте `pub` перед их объявлением.
- **Ключевое слово `use`**: Внутри области видимости использование ключевого слова `use` создаёт ярлыки для элементов, чтобы уменьшить повторение длинных путей. В любой области видимости, в которой может обращаться к `crate::garden::vegetables::Asparagus`, вы можете создать ярлык `use crate::garden::vegetables::Asparagus;` и после этого вам нужно просто писать `Asparagus`, чтобы использовать этот тип в этой области видимости.

Мы создали бинарный крейт `backyard`, который иллюстрирует эти правила. Директория крейта,также названная как `backyard`, содержит следующие файлы и директории:

```text
backyard
├── Cargo.lock
├── Cargo.toml
└── src
├── garden
│   └── vegetables.rs
├── garden.rs
└── main.rs
```

Файл корня крейта в нашем случае это *src/main.rs*, и его содержимое:

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

```rust,noplayground,ignore
{{#rustdoc_include ../listings/ch07-managing-growing-projects/quick-reference-example/src/main.rs}}
```

Строка `pub mod garden;` говорит компилятору о подключении кода, найденном в *src/garden.rs*, который:

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

```rust,noplayground,ignore
{{#rustdoc_include ../listings/ch07-managing-growing-projects/quick-reference-example/src/garden.rs}}
```

А здесь, `pub mod vegetables;` указывает на подключаемый код в *src/garden/vegetables.rs*. Этот код:

```rust,noplayground,ignore
{{#rustdoc_include ../listings/ch07-managing-growing-projects/quick-reference-example/src/garden/vegetables.rs}}
```

Теперь давайте рассмотрим детали этих правил и продемонстрируем их в действии!

### Группировка в модулях связанного кода

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

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

Expand All @@ -16,7 +74,7 @@
{{#rustdoc_include ../listings/ch07-managing-growing-projects/listing-07-01/src/lib.rs}}
```

<span class="caption">Листинг 7-1. Модуль <code>front_of_house</code> содержащий другие модули, которые затем содержат функции</span>
<span class="caption">Листинг 7-1. Модуль <code>front_of_house</code>, содержащий другие модули, которые затем содержат функции</span>

Мы определяем модуль, начиная с ключевого слова `mod`, затем определяем название модуля (в данном случае `front_of_house`) и размещаем фигурные скобки вокруг тела модуля. Внутри модулей, можно иметь другие модули, как в случае с модулями `hosting` и `serving`. Модули также могут содержать определения для других элементов, таких как структуры, перечисления, константы, типажи или - как в листинге 7-1 - функции.

Expand Down

0 comments on commit a557dd8

Please sign in to comment.