gpt4 book ai didi

rust - "pub use"和 "pub mod"之间的区别?

转载 作者:行者123 更新时间:2023-12-03 08:04:00 31 4
gpt4 key购买 nike

假设我在 Rust 包中有这个文件层次结构:

src/...
src/m1/mod.rs
src/m1/path/m2.rs

拥有以下行的实际区别是什么:

pub mod path::m2;

在我的文件m1/mod.rs中,而不是包含以下行:

pub use path::m2;

离开一段时间后试图刷新我对 Rust 的理解,所以这不是我的第一个学习周期。 (当然,对于其他读者来说可能是这样。)我这样说是因为我并不是要求对 usemod 之间的差异进行一般性解释。我的不清楚之处在于上述两个指令。看起来它们都可以使文件 src/m1/path/m2.rs 中的模块可供模块 m1 以及导入它的其他任何东西使用(因为两个指令上的 pub 前缀)。是对的吗?这些是完美的别名,还是会有一些差异?哪个习语比另一个更好?

最佳答案

我稍后会编辑此答案以提供更完整的解释。但是,在此处发布的评论和其他答案的帮助下,再加上一些实验,我想我对这些指令有了更好的理解。在某些情况下,可以使用 pub usepub mod,尽管它们是人为的,并且在任何情况下两者都可以工作人们应该更喜欢前者(见下面的第三点)。主要区别是:

  1. pub use 后跟一个路径(裸标识符 m2self::m2 相同)。 pub mod 后面仅跟一个标识符。

    pub mod m2;main.rslib.rs 中将包含文件 ./m2.rs 的内容(或./m2/mod.rs)。如果 pub mod m2; 行位于文件 path/m1.rs(或 path/m1/mod.rs)中,则包含的文件将改为 path/m1/m2.rs (或 path/m1/m2/mod.rs)。

    (您可以使用 mod m2 { include!("path/m2.rs") } 包含来自另一个位置的模块,但这不是惯用的。我还看到了一些属性技巧影响加载模块的位置。但一般情况下,事情会按照上一段所述进行。)

  2. use 指令不会请求/命令编译任何其他文件。需要 mod 指令来执行此操作。

    (事实上,附加文件不是单独编译的,而是合并到发生 mod 指令的源文件中。只有作为 crate 根的文件(加上合并到其中的任何文件)才能获得已编译。)

  3. 如果您的包中的一个文件有 pub mod m2; 行,那么另一个文件也可以选择使用 pub mod >酒吧使用。受上述第 1 点施加的限制。

    但如果您处于这种情况,您就不会想使用 mod 指令,因为这会再次将相关代码合并到您的源代码树中。也许编译器最终可能会撤消重复,但是您希望这样做会得到什么好处?

    书中的“Separating Modules into Different Files”章节中还有这样的陈述:

    Note that you only need to load the contents of a file using a mod declaration once somewhere in your module tree. Once the compiler knows the file is part of the project (and knows where in the module tree the code resides because of where you’ve put the mod statement), other files in your project should refer to the code in that file using a path to where it was declared...

关于rust - "pub use"和 "pub mod"之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73026201/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com