在编写Rust程序时,我们对标准库中的type、trait、function和macro的使用非常频繁,因此Rust提供了一个Prelude(预导入)模块,它的内容会被编译器自动导入到每个Rust模块的作用域中。
Rust这么做是为了让开发者能够立即使用一些最常用、最基础的类型、trait 和函数,而不需要每次都手动写一长串 use 声明。
Prelude 的核心目的是为开发者提供便利性。它包含了:
- 最常用的类型:例如
String,Vec,Option,Result。 - 最常用的 Trait:例如
Copy,Clone,Drop,Default。 - 基本的 I/O 宏:例如
println!,eprintln!,dbg!。
避免了每次使用这些标准库提供的内容都需要自己添加use:
use std::vec::Vec;
use std::iter::Iterator;
use std::convert::From; // 假设 collect 需要 From
fn main() {
// ...
}
我们可以使用#![no_implicit_prelude]禁用默认的标准Preclude:
#![no_implicit_prelude] // 禁用标准 prelude
fn main() {
// 编译会失败!因为 Vec 和 println! 都没有被导入
// let v = vec![1, 2, 3];
// println!("Hello");
}
在开发大型库(Crate)时,通常会创建自己的 Crate Prelude。这是一种最佳实践,可以为库的用户提供一套精选的常用类型和 Trait,使他们的开发更加便捷。
一个名为 my_library 的库可能会有一个 my_library::prelude 模块,用户可以像这样导入:
use my_library::prelude::*;
fn main() {
// ...
}