使用 path["../xxx.rs"] 导入模块怎么样?

How about using path["../xxx.rs"] to import a module?

当我使用路径方式导入模块时,遇到一个奇怪的问题。代码可能如下所示:

#[path = "../../models.rs"]
mod models;

这行得通。但是有人告诉我不推荐这种方式。为了更好地理解 Rust 导入,我有以下问题:

我上网查了一下,好像没有人有这些问题。

In what situation we should using #[path = "../../xxx.rs"] to import a module?

据我所知,它从来 不是必需的。 它可能是一种处理特殊情况的方法,例如使用条件编译导入单个模块的不同实现, 但您也可以使用 pub use 来获得这种效果。例如,the standard library uses both techniques in the same place, for some reason.

What are the advantages and disadvantages of this way to import module?

它允许您将模块的源代码放在非标准位置。缺点是您将其放置在非标准位置(这可能会让读者(包括您自己)感到惊讶)并且很容易意外复制模块。

第二点是您听说不使用它的主要原因:误解模块系统的工作原理导致人们尝试使用 #[path] 使用 来自多个其他模块的模块,它们最终 复制 模块,导致奇怪的错误,因为模块在不同的上下文中被编译两次。

#[path] 是针对特殊情况的“高级”功能。 无论代码分成多少个文件,都没有必要编写正常的 Rust 代码,这会让读者感到困惑,因此除非必要,否则应该避免。