Прелюдии
Прелюдия — это коллекция имён, которые автоматически вводятся в область видимости каждого модуля в крейте.
Эти имена прелюдий не являются частью самого модуля: они неявно
запрашиваются во время разрешения имён. Например, даже если что-то вроде
Box находится в области видимости в каждом модуле, вы не можете ссылаться на него как на self::Box,
потому что он не является членом текущего модуля.
Существует несколько различных прелюдий:
- Прелюдия стандартной библиотеки
- Внешняя прелюдия
- Языковая прелюдия
- Прелюдия
macro_use - Инструментальная прелюдия
Прелюдия стандартной библиотеки
Каждый крейт имеет прелюдию стандартной библиотеки, которая состоит из имён из одного модуля стандартной библиотеки.
Используемый модуль зависит от редакции крейта и от того, применён ли атрибут no_std к крейту:
| Редакция | no_std не применён | no_std применён |
|---|---|---|
| 2015 | std::prelude::rust_2015 | core::prelude::rust_2015 |
| 2018 | std::prelude::rust_2018 | core::prelude::rust_2018 |
| 2021 | std::prelude::rust_2021 | core::prelude::rust_2021 |
| 2024 | std::prelude::rust_2024 | core::prelude::rust_2024 |
Note
std::prelude::rust_2015иstd::prelude::rust_2018имеют то же содержимое, что иstd::prelude::v1.
core::prelude::rust_2015иcore::prelude::rust_2018имеют то же содержимое, что иcore::prelude::v1.
Внешняя прелюдия
Внешние крейты, импортированные с помощью extern crate в корневом модуле или предоставленные
компилятору (как с флагом --extern в rustc), добавляются в
внешнюю прелюдию. Если импортированы с псевдонимом, например extern crate orig_name as new_name, то символ new_name вместо этого добавляется в прелюдию.
Крейт core всегда добавляется во внешнюю прелюдию.
Крейт std добавляется, если атрибут no_std не указан в корне крейта.
2018 Edition differences
В редакции 2015 года на крейты во внешней прелюдии нельзя ссылаться через use-объявления, поэтому общепринятой практикой является включение объявлений
extern crateдля их ввода в область видимости.Начиная с редакции 2018 года, use-объявления могут ссылаться на крейты во внешней прелюдии, поэтому использование
extern crateсчитается неидиоматичным.
Note
Дополнительные крейты, поставляемые с
rustc, такие какallocиtest, не включаются автоматически с флагом--externпри использовании Cargo. Они должны быть введены в область видимости с помощью объявленияextern crate, даже в редакции 2018.#![allow(unused)] fn main() { extern crate alloc; use alloc::rc::Rc; }Cargo добавляет
proc_macroво внешнюю прелюдию только для proc-макросных крейтов.
Атрибут no_std
По умолчанию стандартная библиотека автоматически включается в корневой модуль
крейта. Крейт std добавляется в корень вместе с неявным
атрибутом macro_use, подтягивающим все макросы, экспортированные из std, в
прелюдию macro_use. И core, и std добавляются во внешнюю
прелюдию.
Атрибут no_std может быть применён на уровне крейта, чтобы предотвратить
автоматическое добавление крейта std в область видимости.
Он делает три вещи:
- Предотвращает добавление
stdво внешнюю прелюдию.
- Влияет на то, какой модуль используется для составления прелюдии стандартной библиотеки (как описано выше).
- Внедряет крейт
coreв корень крейта вместоstdи подтягивает все макросы, экспортированные изcore, в прелюдиюmacro_use.
Note
Использование прелюдии core вместо стандартной прелюдии полезно, когда крейт предназначен для платформы, которая не поддерживает стандартную библиотеку, или целенаправленно не использует возможности стандартной библиотеки. Эти возможности в основном включают динамическое выделение памяти (например,
BoxиVec) и возможности работы с файлами и сетью (например,std::fsиstd::io).
Warning
Использование
no_stdне предотвращает связывание со стандартной библиотекой. Всё ещё допустимо помещатьextern crate std;в крейт, и зависимости также могут связывать её.
Языковая прелюдия
Языковая прелюдия включает имена типов и атрибутов, которые встроены в язык. Языковая прелюдия всегда находится в области видимости.
Она включает следующее:
- Пространство имён типов
- Логический тип —
bool - Текстовые типы —
charиstr - Целочисленные типы —
i8,i16,i32,i64,i128,u8,u16,u32,u64,u128 - Машинно-зависимые целочисленные типы —
usizeиisize - Типы с плавающей точкой —
f32иf64
- Логический тип —
- Пространство имён макросов
Прелюдия macro_use
Прелюдия macro_use включает макросы из внешних крейтов, которые были
импортированы атрибутом macro_use, применённым к extern crate.
Инструментальная прелюдия
Инструментальная прелюдия включает имена инструментов для внешних инструментов в пространстве имён типов. Смотрите раздел инструментальные атрибуты для подробностей.
Атрибут no_implicit_prelude
Атрибут no_implicit_prelude может быть применён на уровне крейта или
в модуле, чтобы указать, что не следует автоматически вводить прелюдию
стандартной библиотеки, внешнюю прелюдию или инструментальную прелюдию в область видимости для этого
модуля или любого из его потомков.
Этот атрибут не влияет на языковую прелюдию.
2018 Edition differences
В редакции 2015 атрибут
no_implicit_preludeне влияет на прелюдиюmacro_use, и все макросы, экспортированные из стандартной библиотеки, всё ещё включаются в прелюдиюmacro_use. Начиная с редакции 2018, он будет удалять прелюдиюmacro_use.