Rust:无法从2个文件中导入1个模块

时间:2019-03-06 23:14:32

标签: module rust

这是我的文件结构:

src/
├── main.rs
├── args_parser.rs
└── trim.rs

args_parser.rs中,我有一个枚举Args我想在main.rstrim.rs中使用,但是当尝试使用{{1 }}在开始时会显示以下错误消息:

trim.rs

似乎希望trimm.rs仅导入来自此模块的文件,但是在Rust示例(website form)中,它说“此声明将查找名为mod args_parser;的文件或error[E0583]: file not found for module `args_parser` --> src/trim.rs:1:5 | 1 | mod args_parser; | ^^^^^^^^^^^ | = help: name the file either trim/args_parser.rs or trim/args_parser/mod.rs inside the directory "src" ”。

有什么方法可以从my.rsmy/mod.rs导入此文件?

1 个答案:

答案 0 :(得分:4)

您似乎在混淆声明一个模块(mod <name>)和导入一个模块(use <name>)。 mod关键字用于在另一个文件中或在关键字后紧跟花括号的方式声明新模块。然后,您可以使用use导入模块。

使用mod在另一个文件中声明模块时,它会在特定位置查找。例如,当您在main.rsmod.rslib.rs ...

中使用以下语句时
mod abc;

...编译器将在./abc.rsabc/mod.rs中搜索模块的内容。但是,如果我在不同的文件中有相同的语句,例如def.rs,它将代替签入def/abc.rsdef/abc/mod.rs。这就是为什么您的代码无法编译的原因。

要解决此问题,请在主文件中声明该模块,然后将其导入其他位置。代码如下所示:

// in main.rs
mod args_parser;
mod trim;
use args_parser::...; // use whatever you need in main

// in trim.rs
use crate::args_parser::...; // use whatever you need in trim - note the crate:: prefix