What is the prelude?

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.

Leave a Comment