【问题标题】:What is the prelude?前奏是什么?
【发布时间】:2016-04-03 11:27:53
【问题描述】:

在谈到进口时,prelude 这个词经常被 rustaceans 使用。

他们谈论的前奏曲是什么?

它对我的 Rust 程序有何影响?

【问题讨论】:

    标签: rust


    【解决方案1】:

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

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

    但是,如果没有此类操作,可以使用极少数符号:例如 OptionCopy

    这是由于Rust prelude

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

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

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


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


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

    【讨论】:

    • @LukasKalbertodt:啊,好点,我已经开始用vec!panic! 写答案……但找不到这些答案的来源。我会删除它。
    • This RFC 建议为用户 crate 添加前奏功能。它已经关闭了一段时间,但将来可能会恢复。
    • @MatthieuM。感谢您的明确解释。 println! 宏好像不是来自std::prelude
    • @JeremyKao:确实如此,如果您转到prelude page,它会在宏部分列出。 (只需 CTRL+F println
    猜你喜欢
    • 1970-01-01
    • 2015-09-06
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 2020-10-20
    相关资源
    最近更新 更多