Skip to content

Commit

Permalink
Merge pull request #1267 from rust-lang-ru/gitlocalize-26695
Browse files Browse the repository at this point in the history
Translate ch07-05-separating-modules-into-different-files.md via GitLocalize
  • Loading branch information
ava57r authored Oct 12, 2023
2 parents e5d995f + 1532517 commit c805f70
Showing 1 changed file with 13 additions and 12 deletions.
25 changes: 13 additions & 12 deletions rustbook-ru/src/ch07-05-separating-modules-into-different-files.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@

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

```rust,ignore
```rust,ignore,does_not_compile
{{#rustdoc_include ../listings/ch07-managing-growing-projects/listing-07-21-and-22/src/lib.rs}}
```

<span class="caption">Листинг 7-21. Объявление модуля `front_of_house`, чьё содержимое будет в *src/front_of_house.rs*</span>
<span class="caption">Листинг 7-21. Объявление модуля <code>front_of_house</code>, чьё содержимое будет в <em>src/front_of_house.rs</em></span>

Затем поместим код, который был в фигурных скобках, в новый файл с именем *src/front_of_house.rs*, как показано в листинге 7-22. Компилятор знает, что нужно искать в этом файле, потому что он наткнулся в корневом модуле крейта на объявление модуля с именем `front_of_house`.

Expand All @@ -22,9 +22,9 @@
{{#rustdoc_include ../listings/ch07-managing-growing-projects/listing-07-21-and-22/src/front_of_house.rs}}
```

<span class="caption">Листинг 7-22. Определение содержимого модуля `front_of_house` в файле *src/front_of_house.rs*</span>
<span class="caption">Листинг 7-22. Определение содержимого модуля <code>front_of_house</code> в файле <em>src/front_of_house.rs</em></span>

Обратите внимание, что вам нужно только *один раз* загрузить файл с помощью объявления `mod` в вашем дереве модулей. Как только компилятор узнает, что файл является частью проекта (и узнает, где в дереве модулей находится код из-за того, куда вы поместили оператор `mod`), другие файлы в вашем проекте должны ссылаться на код загруженного файла, используя путь к месту, где он был объявлен, как описано в разделе [«Пути для ссылки на элемент в дереве модулей»][paths]<!-- ignore -->. Другими словами, `mod` — это *не* операция «включения», которую вы могли видеть в других языках программирования.
Обратите внимание, что вам нужно только *один раз* загрузить файл с помощью объявления `mod` в вашем дереве модулей. Как только компилятор узнает, что файл является частью проекта (и узнает, где в дереве модулей находится код из-за того, куда вы поместили инструкцию `mod`), другие файлы в вашем проекте должны ссылаться на код загруженного файла, используя путь к месту, где он был объявлен, как описано в разделе [«Пути для ссылки на элемент в дереве модулей»]<!-- ignore -->. Другими словами, `mod` — это *не* операция «включения», которую вы могли видеть в других языках программирования.

Далее мы извлечём модуль `hosting` в его собственный файл. Процесс немного отличается, потому что `hosting` является дочерним модулем для `front_of_house`, а не корневого модуля. Мы поместим файл для `hosting` в новый каталог, который будет назван по имени его предка в дереве модулей, в данном случае это *src/front_of_house/*.

Expand All @@ -40,7 +40,7 @@

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

```rust
```rust,ignore
{{#rustdoc_include ../listings/ch07-managing-growing-projects/no-listing-02-extracting-hosting/src/front_of_house/hosting.rs}}
```

Expand All @@ -50,26 +50,27 @@
>
> До сих пор мы рассматривали наиболее идиоматические пути к файлам, используемые компилятором Rust, но Rust также поддерживает и старый стиль пути к файлу. Для модуля с именем `front_of_house`, объявленного в корневом модуле крейта, компилятор будет искать код модуля в:
>
> * *src/front_of_house.rs* (что мы рассматривали)
> * *src/front_of_house/mod.rs* (старый стиль, всё ещё поддерживаемый путь)
> - *src/front_of_house.rs* (что мы рассматривали)
> - *src/front_of_house/mod.rs* (старый стиль, всё ещё поддерживаемый путь)
>
> Для модуля с именем `hosting`, который является подмодулем `front_of_house`, компилятор будет искать код модуля в:
>
> * *src/front_of_house/hosting.rs* (что мы рассматривали)
> * *src/front_of_house/hosting/mod.rs* (старый стиль, всё ещё поддерживаемый путь)
> - *src/front_of_house/hosting.rs* (что мы рассматривали)
> - *src/front_of_house/hosting/mod.rs* (старый стиль, всё ещё поддерживаемый путь)
>
> Если вы используете оба стиля для одного и того же модуля, вы получите ошибку компилятора. Использование сочетания обоих стилей для разных модулей в одном проекте разрешено, но это может сбивать с толку людей, перемещающихся по вашему проекту.
>
> Основным недостатком стиля, в котором используются файлы с именами *mod.rs*, является то, что в вашем проекте может оказаться много файлов с именами *mod.rs*, что может привести к путанице, если вы одновременно откроете их в редакторе.
Мы перенесли код каждого модуля в отдельный файл, а дерево модулей осталось прежним. Вызовы функций в `eat_at_restaurant` будут работать без каких-либо изменений, несмотря на то, что определения находятся в разных файлах. Этот метод позволяет перемещать модули в новые файлы по мере увеличения их размеров.

Обратите внимание, что оператор `pub use crate::front_of_house::hosting` в *src/lib.rs* также не изменился, и `use` не влияет на то, какие файлы компилируются как часть крейта. Ключевое слово `mod` объявляет модули, и Rust ищет в файле с тем же именем, что и у модуля, код, который входит в этот модуль.
Обратите внимание, что инструкция `pub use crate::front_of_house::hosting` в *src/lib.rs* также не изменилась, и `use` не влияет на то, какие файлы компилируются как часть крейта. Ключевое слово `mod` объявляет модули, и Rust ищет в файле с тем же именем, что и у модуля, код, который входит в этот модуль.

## Итог

Rust позволяет разбить пакет на несколько крейтов и крейт - на модули, так что вы можете ссылаться на элементы, определённые в одном модуле, из другого модуля. Это можно делать при помощи указания абсолютных или относительных путей. Эти пути можно добавить в область видимости оператором `use`, поэтому вы можете пользоваться более короткими путями для многократного использования элементов в этой области видимости. Код модуля по умолчанию является приватным, но можно сделать определения общедоступными, добавив ключевое слово `pub`.
Rust позволяет разбить пакет на несколько крейтов и крейт - на модули, так что вы можете ссылаться на элементы, определённые в одном модуле, из другого модуля. Это можно делать при помощи указания абсолютных или относительных путей. Эти пути можно добавить в область видимости инструкцией `use`, поэтому вы можете пользоваться более короткими путями для многократного использования элементов в этой области видимости. Код модуля по умолчанию является приватным, но можно сделать определения общедоступными, добавив ключевое слово `pub`.

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

[paths]: ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html

[«Пути для ссылки на элемент в дереве модулей»]: ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html

0 comments on commit c805f70

Please sign in to comment.