In Rust, in order to use a symbol, you must either:
- have defined the symbol in the current scope
- have imported the symbol in the current scope via a
use
directive: use std::mem;
- be referring to the symbol using its absolute path:
std::mem::replace
however, some very few symbols can be used without such actions: Option
or Copy
for example!
This is due to the Rust prelude.
A number of traits, types and functions were judged to be so frequently used that it made sense not to require that their use required explicitly importing the necessary symbols each and every time. This is achieved thanks to two implicit actions taken by the compiler:
- at the root of every crate, the compiler injects an implicit
extern crate std;
- in every module, the compiler injects an implicit
use std::prelude::v1::*;
(for now)
std::prelude::v1
is just a regular module which re-exports those frequently used symbols using the pub use ...
syntax. Its exact content can be found here.
A number of other libraries, or even sub-components of the standard library also define a prelude
module that you may import with the same glob import syntax: use xxx::prelude::*;
. Unlike the std::prelude
however those are not special-cased by the compiler and therefore require explicit importing.
The compiler is agnostic to the exact content of the prelude, therefore if one was to replace the std
crate with their own (for example, in embedded development) then one would decide what goes into their std::prelude::v1
module.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…