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

Import 如何使用Cargo/Rust在模块中包含来自同一目录的文件?,import,module,rust,rust-cargo,Import,Module,Rust,Rust Cargo,我有一个Cargo项目,由同一目录中的三个文件组成:main.rs、mod1.rs和mod2.rs 我想将函数从mod2.rs导入mod1.rs,就像我将函数从mod1.rs导入main.rs一样 我已经阅读了所需的文件结构,但我不明白-命名所有导入的文件mod将导致编辑器中的小混乱,而且这只会使项目层次结构复杂化 有没有一种方法可以独立于目录结构导入/包含文件,如我在Python或C++中所做的那样?p> main.rs: mod mod1; // Works fn main() {

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

我想将函数从
mod2.rs
导入
mod1.rs
,就像我将函数从
mod1.rs
导入
main.rs
一样
我已经阅读了所需的文件结构,但我不明白-命名所有导入的文件
mod
将导致编辑器中的小混乱,而且这只会使项目层次结构复杂化

有没有一种方法可以独立于目录结构导入/包含文件,如我在Python或C++中所做的那样?p> 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");
}
建筑的结果是:

错误:无法在此位置声明新模块
-->src\mod1.rs:1:5
|
1 | mod mod2;
|     ^^^^
|
注意:可以通过'src/mod.rs将此模块'src'移动到它自己的目录`
-->src\mod1.rs:1:5
|
1 | mod mod2;
|     ^^^^
注:。。。或者“使用”模块“mod2”,而不是重新定义它
-->src\mod1.rs:1:5
|
1 | mod mod2;
|     ^^^^

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

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

mod mod1;
mod mod2;

fn main() {
    println!("Hello, world!");
    mod1::mod1fn();
}
然后,您可以
mod1
内部使用板条箱::mod2

use crate::mod2;

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

如果你还没有读过,我建议你读一读——它们可能会让语言新手感到有点困惑。

如果你不希望你的
mod
语句都在你的主文件中(例如:在
main.rs
中,你不会在某个模块中使用一些公共成员,在本例中是
mod2
)您可以执行以下操作:

按以下方式构造您的
src

main.rs
my_module:
  mod.rs
  mod1.rs
  mod2.rs
然后您可以只
修改我的模块
使用我的模块::mod1
,如下所示:

mod mod1;
mod mod2;

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

mod mod1; // Works

fn main() {
    println!("Hello, world!");
    mod1::mod1fn();
}
mod my_模块;
使用my_模块::mod1;
fn main(){
println!(“你好,世界!”);
mod1::mod1fn();
}
my_模块/模块rs

pub mod mod1;
pub mod mod2;
my_模块/mod1.rs

使用super::mod2;
发布fn mod1fn(){
println!(“1”);
mod2::mod2fn();
}

非常感谢您!我几乎可以肯定没有这样的选择。我读了那一章,但不明白我能做你所描述的。@Neo:没问题!我发现,一旦你对模块系统有了感觉,它就有了意义,但肯定有一点学习曲线-。@Neo:我还推荐这篇关于如何对模块系统进行心理建模的博文: