Использование use, super и self
Модуль может внести символы из другого модуля в область видимости с помощью use. Обычно в начале каждого модуля вы увидите что-то подобное:
// Copyright 2022 Google LLC
// SPDX-License-Identifier: Apache-2.0
use std::collections::HashSet;
use std::process::abort;
Пути
Пути разрешаются следующим образом:
-
Как относительный путь:
fooилиself::fooссылаются наfooв текущем модуле,super::fooссылается наfooв родительском модуле.
-
Как абсолютный путь:
crate::fooссылается наfooв корне текущего крейта,bar::fooссылается наfooв крейтеbar.
-
Часто символы «реэкспортируют» по более короткому пути. Например, верхний
lib.rsв крейте может содержать// Copyright 2022 Google LLC // SPDX-License-Identifier: Apache-2.0 mod storage; pub use storage::disk::DiskStorage; pub use storage::network::NetworkStorage;что позволяет сделать
DiskStorageиNetworkStorageдоступными другим крейтам по удобному короткому пути. -
В основном
useнужен только для элементов, которые появляются в модуле. Однако трейт должен быть в области видимости, чтобы вызывать любые его методы, даже если тип, реализующий этот трейт, уже находится в области видимости. Например, чтобы использовать методread_to_stringдля типа, реализующего трейтRead, нужно написатьuse std::io::Read. -
Оператор
useможет содержать подстановочный символ:use std::io::*. Это не рекомендуется, потому что неясно, какие элементы импортированы, а они со временем могут меняться.