我有一个Cargo项目,由同一目录中的三个文件组成:main.rsmod1.rsmod2.rs.

我想将函数从mod2.rs导入到mod1.rs,就像我将函数从mod1.rs导入到main.rs一样

有没有一种方法可以独立于目录 struct 导入/包含文件,就像我在Python或C++中那样?

主要的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;
  |     ^^^^

我不能使用它,因为它在任何地方都不作为模块存在,而且我不想修改目录 struct .

推荐答案

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

mod mod1;
mod mod2;

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

然后,你可以在mod1中 Select use crate::mod2:

use crate::mod2;

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

如果你还没有读过the chapter on modules in the new version of the Rust book,我建议你读一读——对于刚学这门语言的人来说,它们可能会有点让人困惑.

Rust相关问答推荐

borrow 和内部IntoIterator

如何使用Match比较 struct 中的值

这种获取-释放关系是如何运作的?

关于如何初始化弱 struct 字段的语法问题

在Rust中克隆源自INTO_ITER()的迭代器的成本?

不同类型泛型的映射

为什么实现特征的对象期望比具体对象有更长的生命周期?

带引脚和不带引脚的比较功能

`use` 和 `crate` 关键字在 Rust 项目中效果不佳

当没有实际结果时,如何在 Rust 中强制执行错误处理?

为什么我们有两种方法来包含 serde_derive?

std::vector::shrink_to_fit 如何在 Rust 中工作?

如何在 Rust 的 Hyper 异步闭包中从外部范围正确读取字符串值

从 Axum IntoResponse 获取请求标头

在每个循环迭代中删除borrow

如何在 Rust 中创建最后一个元素是可变长度数组的 struct ?

在 FFI 的上下文中,未初始化是什么意思?

Rust 为什么 (u32, u32) 的枚举变体的大小小于 (u64)?

Rust 生命周期:不能在方法内重新borrow 可变字段

如何在 Rust 中构建一个 str