Ответ 1
В Rust, чтобы использовать символ, вы должны либо:
- определили символ в текущей области
- импортировали символ в текущей области действия с помощью директивы
use
:use std::mem;
- ссылаться на символ, используя его абсолютный путь:
std::mem::replace
однако, некоторые такие символы могут использоваться без таких действий: Option
или Copy
например!
Это связано с предикатом ржавчины.
Было оценено так часто, как правило, несколько признаков, типов и функций, которые имели смысл не требовать, чтобы их использование требовало явного импорта необходимых символов каждый раз. Это достигается благодаря двум неявным действиям, предпринятым компилятором:
- в корне каждого ящика компилятор вводит неявный
extern crate std;
- в каждом модуле компилятор вводит неявный
use std::prelude::v1::*;
(пока)
std::prelude::v1
является просто регулярным модулем, который реэкспортирует те часто используемые символы, используя синтаксис pub use ...
. Его точное содержание можно найти здесь.
Ряд других библиотек или даже подкомпонентов стандартной библиотеки также определяют модуль prelude
, который можно импортировать с тем же синтаксисом импорта glob: use xxx::prelude::*;
. В отличие от std::prelude
, однако эти компиляторы не имеют специальной оболочки и поэтому требуют явного импорта.
Компилятор не зависит от точного содержимого прелюдии, поэтому, если бы кто-то заменил ящик std
своими собственными (например, во встроенной разработке), тогда можно было бы решить, что входит в их модуль std::prelude::v1
.