RUST:有没有更优雅的方式来导入 mod?

0 rust rust-cargo rust-analyzer

这是我的项目结构:

\n
.\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.rs\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 sub_folder\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 mod.rs\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 sub_mod.rs\n
Run Code Online (Sandbox Code Playgroud)\n

在 中sub_mod.rs,如果我像这样导入,则货物不会警告我sub_folder/

\n
.\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.rs\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 sub_folder\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 mod.rs\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 sub_mod.rs\n
Run Code Online (Sandbox Code Playgroud)\n

但我做不到

\n
#[path = "./sub_folder/mod.rs"]\nmod sub_folder;\n
Run Code Online (Sandbox Code Playgroud)\n

但它main.rs有效!

\n

有没有更温和的方式sub_mod.rs导入sub_folder/

\n

Kev*_*eid 5

您几乎不应该使用该#[path]属性。它用于将源代码放在非标准位置,使用它很容易出错。相反,请确保您的mod声明和文件位置相互匹配。

\n

因此,如果路径是src/sub_folder/mod.rs(或src/sub_folder.rs),那么您应该在 中声明该模块,main.rs因为main.rs(或者lib.rs如果您正在这样做)是 crate 根,即声明所有顶级模块的位置。也就是说,main.rs包含

\n
mod sub_folder;\nmod sub_mod;\n
Run Code Online (Sandbox Code Playgroud)\n

这两个模块在板条箱中是兄弟模块。然后为了sub_mod导入(而不是定义),它应该包含sub_folder

\n
use super::sub_folder;\n
Run Code Online (Sandbox Code Playgroud)\n

或者,等效地(绝对路径而不是相对路径),

\n
use crate::sub_folder;\n
Run Code Online (Sandbox Code Playgroud)\n
\n

提示:如果您使用与 兼容的编辑器rust-analyzer,您可以让它帮助您正确创建模块。不要创建文件;相反,请mod my_module;在现有源代码中的某个位置写入,等待出现“丢失文件”错误,然后运行提供的修复 \xe2\x80\x9cCreate module\xe2\x80\x9d。rust-analyzer 会在正确的位置为您创建该文件。

\n