前奏是什么?

时间:2016-04-03 11:27:54

标签: rust

在谈论导入时,生锈的人经常使用 prelude 这个词。

他们谈论的前奏是什么?

它如何影响我的Rust程序?

1 个答案:

答案 0 :(得分:19)

在Rust中,为了使用符号,您必须:

  • 已在当前范围中定义了该符号
  • 已通过use指令在当前范围中导入了该符号:use std::mem;
  • 使用其绝对路径引用该符号:std::mem::replace

但是,如果没有这些操作,可以使用一些非常少的符号:例如OptionCopy

这是由于Rust prelude

许多特征,类型和功能被认为是如此频繁使用,以至于不要求它们的使用需要每次都明确地输入必要的符号。这要归功于编译器采取的两个隐式操作:

  • 在每个包的根目录下,编译器注入一个隐式extern crate std;
  • 在每个模块中,编译器都会注入隐式use std::prelude::v1::*;(现在)

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

许多其他库,甚至标准库的子组件也定义了一个prelude模块,您可以使用相同的glob导入语法导入该模块:use xxx::prelude::*;。与std::prelude不同,但编译器并不特殊,因此需要显式导入。

编译器对前奏的确切内容是不可知的,因此,如果要用自己的std crate替换std::prelude::v1 crate(例如,在嵌入式开发中),则可以决定他们的{{1模块。