序曲

序曲是一组名称的集合,这些名称会被自动引入到 crate 中每个模块的作用域中。

这些序曲名称本身不是模块的一部分:它们是在名称解析期间隐式查询的。 例如,即使像 Box 这样的东西在每个模块的作用域中,你也不能将其称为 self::Box,因为它不是当前模块的成员。

有几种不同的序曲

标准库序曲

每个 crate 都有一个标准库序曲,其中包含来自单个标准库模块的名称。 使用的模块取决于 crate 的版本,以及是否将 no_std 属性应用于 crate

注意:

std::prelude::rust_2015std::prelude::rust_2018 的内容与 std::prelude::v1 相同。

core::prelude::rust_2015core::prelude::rust_2018 的内容与 core::prelude::v1 相同。

外部序曲

使用 extern crate 在根模块中导入的外部 crate,或提供给编译器(如使用 rustc--extern 标志)的外部 crate,会添加到外部序曲中。 如果使用别名导入,如 extern crate orig_name as new_name,则符号 new_name 会添加到序曲中。

core crate 始终添加到外部序曲中。 只要在 crate 根目录中没有指定 no_std 属性std crate 就会被添加。

版本差异:在 2015 版本中,外部序曲中的 crate 不能通过 use 声明引用,因此通常的标准做法是包含 extern crate 声明以将其引入作用域。

从 2018 版本开始,use 声明 可以引用外部序曲中的 crate,因此使用 extern crate 被认为是不符合惯例的。

注意:使用 rustc 附带的其他 crate,例如 alloctest,在使用 Cargo 时不会自动通过 --extern 标志包含。即使在 2018 版本中,它们也必须通过 extern crate 声明引入作用域。

#![allow(unused)]
fn main() {
extern crate alloc;
use alloc::rc::Rc;
}

Cargo 仅为 proc-macro crate 将 proc_macro 引入外部序曲。

no_std 属性

默认情况下,标准库会自动包含在 crate 根模块中。 std crate 会被添加到根目录,同时还会隐式地添加一个 macro_use 属性,将所有从 std 导出的宏拉入 macro_use 序曲中。corestd 都会被添加到 外部序曲中。

no_std 属性可以应用于 crate 级别,以防止 std crate 被自动添加到作用域中。它会做三件事

注意:当 crate 的目标平台不支持标准库,或者有意不使用标准库的功能时,使用 core 序曲而不是标准序曲非常有用。这些功能主要包括动态内存分配(例如 BoxVec)以及文件和网络功能(例如 std::fsstd::io)。

警告:使用 no_std 并不能阻止标准库被链接进来。仍然可以将 extern crate std; 放入 crate 中,并且依赖项也可以将其链接进来。

语言序曲

语言序曲包括语言内置的类型和属性的名称。 语言序曲始终在作用域中。 它包括以下内容

macro_use 序曲

macro_use 序曲包含来自外部 crate 的宏,这些宏是通过应用于 extern cratemacro_use 属性导入的。

工具序曲

工具序曲包含 类型命名空间中外部工具的工具名称。 有关更多详细信息,请参阅 工具属性部分。

no_implicit_prelude 属性

no_implicit_prelude 属性可以应用于 crate 级别或模块级别,以指示它不应自动将 标准库序曲外部序曲工具序曲引入到该模块或其任何后代的作用域中。

此属性不影响 语言序曲

版本差异:在 2015 版本中,no_implicit_prelude 属性不影响 macro_use 序曲,并且所有从标准库导出的宏仍然包含在 macro_use 序曲中。 从 2018 版本开始,它将移除 macro_use 序曲。