前奏是什么?

80

当谈论到导入时,Rustacean 们偶尔会使用“prelude”这个词。

他们所谈论的这个“prelude”是什么呢?

它如何影响我的 Rust 程序?

1个回答

78
在Rust中,为了使用一个符号,你必须要么:
- 在当前作用域内定义该符号 - 通过use指令导入当前作用域内的符号: use std::mem; - 使用其绝对路径引用符号:std::mem::replace 然而,极少数符号可以在不执行这些操作的情况下使用,例如OptionCopy
这是由于 Rust预设。一些特定的traits、types和functions被认为是如此频繁地使用,以至于没有要求每次都显式地导入必要的符号。这得益于编译器采取的两个隐式操作:
- 在每个crate的根目录下,编译器注入一个隐式的extern crate std; - 在每个模块中,编译器注入一个隐式的use std::prelude::v1::*;(目前)

std::prelude::v1 是一个常规模块,它使用 pub use ... 语法重新导出那些经常使用的符号。其确切内容可以在这里找到。


许多其他库,甚至标准库的子组件也定义了一个prelude模块,您可以使用相同的全局导入语法进行导入:use xxx::prelude::*;。但与std::prelude不同,它们不是编译器特殊处理的对象,因此需要显式导入。
编译器对预导入模块的具体内容并不关心,因此如果有人想用自己的 crate 替换 std crate(例如在嵌入式开发中),则需要决定将哪些内容放入他们自己的 std::prelude::v1 模块中。

1
@LukasKalbertodt:啊,好的观点,我一开始用vec!panic!写答案,但找不到它们来自哪里。我会把它删除。 - Matthieu M.
这个RFC提议为用户创建的箱添加预导入功能。它已经在一段时间前关闭,但未来可能会重新启动。 - Lukas Kalbertodt
@MatthieuM。感谢您清晰的解释。看起来println!宏不是来自std::prelude - Jeremy Kao
@JeremyKao:如果你去预备页面,它在宏部分中列出。(只需CTRL+F println) - Matthieu M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接