Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Прелюдии

Прелюдия — это коллекция имён, которые автоматически вводятся в область видимости каждого модуля в крейте.

Эти имена прелюдий не являются частью самого модуля: они неявно запрашиваются во время разрешения имён. Например, даже если что-то вроде Box находится в области видимости в каждом модуле, вы не можете ссылаться на него как на self::Box, потому что он не является членом текущего модуля.

Существует несколько различных прелюдий:

Прелюдия стандартной библиотеки

Каждый крейт имеет прелюдию стандартной библиотеки, которая состоит из имён из одного модуля стандартной библиотеки.

Используемый модуль зависит от редакции крейта и от того, применён ли атрибут no_std к крейту:

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 в область видимости.

Он делает три вещи:

  • Внедряет крейт core в корень крейта вместо std и подтягивает все макросы, экспортированные из core, в прелюдию macro_use.

Note

Использование прелюдии core вместо стандартной прелюдии полезно, когда крейт предназначен для платформы, которая не поддерживает стандартную библиотеку, или целенаправленно не использует возможности стандартной библиотеки. Эти возможности в основном включают динамическое выделение памяти (например, Box и Vec) и возможности работы с файлами и сетью (например, std::fs и std::io).

Warning

Использование no_std не предотвращает связывание со стандартной библиотекой. Всё ещё допустимо помещать extern crate std; в крейт, и зависимости также могут связывать её.

Языковая прелюдия

Языковая прелюдия включает имена типов и атрибутов, которые встроены в язык. Языковая прелюдия всегда находится в области видимости.

Она включает следующее:

Прелюдия 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.