Объявления внешних крейтов
Syntax
ExternCrate → extern crate CrateRef AsClause? ;
CrateRef → IDENTIFIER | self
AsClause → as ( IDENTIFIER | _ )
Объявление extern crate указывает зависимость от внешнего крейта.
Внешний крейт затем привязывается к объявляющей области видимости как данный идентификатор в пространстве имён типов.
Кроме того, если extern crate появляется в корне крейта, то имя крейта также добавляется в внешнюю прелюдию, делая его автоматически в области видимости во всех модулях.
Предложение as может использоваться для привязки импортируемого крейта к другому имени.
Внешний крейт разрешается в конкретное soname во время компиляции, и
требование связи времени выполнения с этим soname передаётся линковщику для
загрузки во время выполнения. soname разрешается во время компиляции путём сканирования
пути библиотеки компилятора и сопоставления опционального crate_name с
атрибутами crate_name, которые были объявлены на внешнем крейте при его
компиляции. Если crate_name не предоставлен, предполагается атрибут name по умолчанию,
равный идентификатору, указанному в объявлении extern crate.
Крейт self может быть импортирован, что создаёт привязку к текущему крейту.
В этом случае предложение as должно использоваться для указания имени, к которому его привязать.
Три примера объявлений extern crate:
extern crate pcre;
extern crate std; // эквивалентно: extern crate std as std;
extern crate std as ruststd; // связывание с 'std' под другим именем
При именовании крейтов Rust дефисы запрещены. Однако пакеты Cargo могут
использовать их. В таком случае, когда Cargo.toml не указывает имя крейта,
Cargo прозрачно заменит - на _ (см. RFC 940 для более подробной
информации).
Вот пример:
// Импорт пакета Cargo hello-world
extern crate hello_world; // дефис заменён на подчёркивание
Импорты с подчёркиванием
Зависимость от внешнего крейта может быть объявлена без привязки его имени в области видимости
с использованием подчёркивания в форме extern crate foo as _. Это может быть
полезно для крейтов, которые нужно только линковать, но на которые никогда не ссылаются, и
это позволит избежать сообщений о неиспользовании.
Атрибут macro_use работает как обычно и импортирует имена макросов
в macro_use прелюдию.
Атрибут no_link
Атрибут no_link атрибут может быть применён к элементу extern crate для предотвращения линковки крейта.
Note
Это полезно, например, когда нужны только макросы из крейта.
Example
#[no_link] extern crate other_crate; other_crate::some_macro!();
Атрибут no_link использует синтаксис MetaWord.
Атрибут no_link может быть применён только к объявлению extern crate.
Note
rustcигнорирует использование в других позициях, но выдает предупреждение. Это может стать ошибкой в будущем.
Только первое использование no_link на объявлении extern crate имеет эффект.
Note
rustcвыдает предупреждение на любое использование после первого. Это может стать ошибкой в будущем.