如何使用Cargo / Rust在模块中包含同一目录中的文件?

时间:2017-10-19 12:10:17

标签: import module rust rust-cargo

我有一个货物项目,包含同一目录中的三个文件:main.rsmod1.rsmod2.rs

我想将函数从mod2.rs导入到mod1.rs,就像我将函数从mod1.rs导入main.rs一样。
我已经阅读了所需的文件结构但我没有得到它 - 命名所有导入的文件mod将导致编辑器中的轻微混淆,这也只是使项目层次结构复杂化。

有没有办法像Python或C ++那样独立于目录结构导入/包含文件?

main.rs:

mod mod1; // Works

fn main() {
    println!("Hello, world!");
    mod1::mod1fn();
}

mod1.rs:

mod mod2; // Fails

pub fn mod1fn() {
    println!("1");
    mod2::mod2fn();
}

mod2.rs:

pub fn mod2fn() {
    println!("2");
}

构建结果:

error: cannot declare a new module at this location
 --> src\mod1.rs:1:5
  |
1 | mod mod2;
  |     ^^^^
  |
note: maybe move this module `src` to its own directory via `src/mod.rs`
 --> src\mod1.rs:1:5
  |
1 | mod mod2;
  |     ^^^^
note: ... or maybe `use` the module `mod2` instead of possibly redeclaring it
 --> src\mod1.rs:1:5
  |
1 | mod mod2;
  |     ^^^^

我不能use因为它在任何地方都不作为模块存在,我不想修改目录结构。

2 个答案:

答案 0 :(得分:6)

所有顶级模块声明都应该放在main.rs中,如下所示:

mod mod1;
mod mod2;

fn main() {
    println!("Hello, world!");
    mod1::mod1fn();
}

然后您可以use mod2内的mod1

use mod2;

pub fn mod1fn() {
    println!("1");
    mod2::mod2fn();
}

我建议您阅读the chapter on modules in the new version of the Rust book,如果您还没有 - 对于不熟悉该语言的人来说,这会让您感到有些困惑。

答案 1 :(得分:1)

如果您不想将 mod 语句全部放在主文件中(例如:在 main.rs 中,您不会在某个模块中使用某些公共成员,在本例中它是 {{1 }}) 您可以执行以下操作:

以这种方式构建您的 mod2

src

那么你可以只用 main.rs my_module: mod.rs mod1.rs mod2.rs mod my_module,就像这样:

main.rs:

use my_module::mod1

my_module/mod.rs

mod my_module;
use my_module::mod1;

fn main() {
    println!("Hello, world!");
    mod1::mod1fn();
}

my_module/mod1.rs

pub mod mod1;
pub mod mod2;