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

问题描述 投票:3回答:1

这是我的文件结构:

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

args_parser.rs我有我想在Argsmain.rs使用的枚举trim.rs,但是当试图在开头用trim.rs运行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"

看起来它希望trim.rs只导入来自这个模块的文件,但是在Rust中通过示例(https://doc.rust-lang.org/rust-by-example/mod/split.html)它说“这个声明将寻找一个名为my.rsmy/mod.rs的文件”。

有什么办法可以从main.rstrim.rs导入这个文件吗?

module rust
1个回答
5
投票

你似乎在混淆声明一个模块(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
© www.soinside.com 2019 - 2024. All rights reserved.