序曲
序曲是一组名称的集合,这些名称会被自动引入到 crate 中每个模块的作用域中。
这些序曲名称本身不是模块的一部分:它们是在名称解析期间隐式查询的。 例如,即使像 Box
这样的东西在每个模块的作用域中,你也不能将其称为 self::Box
,因为它不是当前模块的成员。
有几种不同的序曲
标准库序曲
每个 crate 都有一个标准库序曲,其中包含来自单个标准库模块的名称。 使用的模块取决于 crate 的版本,以及是否将 no_std
属性应用于 crate
版本 | 未应用 no_std | 已应用 no_std |
---|---|---|
2015 | std::prelude::rust_2015 | core::prelude::rust_2015 |
2018 | std::prelude::rust_2018 | core::prelude::rust_2018 |
2021 | std::prelude::rust_2021 | core::prelude::rust_2021 |
注意:
std::prelude::rust_2015
和std::prelude::rust_2018
的内容与std::prelude::v1
相同。
core::prelude::rust_2015
和core::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,例如alloc
和test
,在使用 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
序曲中。core
和 std
都会被添加到 外部序曲中。
no_std
属性可以应用于 crate 级别,以防止 std
crate 被自动添加到作用域中。它会做三件事
- 阻止将
std
添加到 外部序曲中。 - 影响用于组成标准库序曲的模块(如上所述)。
- 将
core
crate 注入到 crate 根目录中,而不是std
,并将所有从core
导出的宏拉入macro_use
序曲中。
注意:当 crate 的目标平台不支持标准库,或者有意不使用标准库的功能时,使用 core 序曲而不是标准序曲非常有用。这些功能主要包括动态内存分配(例如
Box
和Vec
)以及文件和网络功能(例如std::fs
和std::io
)。
警告:使用
no_std
并不能阻止标准库被链接进来。仍然可以将extern crate std;
放入 crate 中,并且依赖项也可以将其链接进来。
语言序曲
语言序曲包括语言内置的类型和属性的名称。 语言序曲始终在作用域中。 它包括以下内容
macro_use
序曲
macro_use
序曲包含来自外部 crate 的宏,这些宏是通过应用于 extern crate
的 macro_use
属性导入的。
工具序曲
工具序曲包含 类型命名空间中外部工具的工具名称。 有关更多详细信息,请参阅 工具属性部分。
no_implicit_prelude
属性
no_implicit_prelude
属性可以应用于 crate 级别或模块级别,以指示它不应自动将 标准库序曲、外部序曲或 工具序曲引入到该模块或其任何后代的作用域中。
此属性不影响 语言序曲。
版本差异:在 2015 版本中,
no_implicit_prelude
属性不影响macro_use
序曲,并且所有从标准库导出的宏仍然包含在macro_use
序曲中。 从 2018 版本开始,它将移除macro_use
序曲。