以下示例通过以下链接将模块分为不同的文件: https://doc.rust-lang.org/book/ch07-02-modules-and-use-to-control-scope-and-privacy.html#separating-modules-into-different-files
我已经在src目录下创建了以下文件:
├── main.rs
├── sound
│ └── instrument.rs
└── sound.rs
在src/main.rs
中:
mod sound;
fn main() {
// Absolute path
crate::sound::instrument::clarinet();
// Relative path
sound::instrument::clarinet();
}
在src/sound.rs
中:
pub mod instrument;
在src/sound/instrument.rs
中:
pub fn clarinet() {
println!("clarinet");
}
该示例将按预期进行编译和运行。现在我的问题是:为什么在main.rs
中,它可以从同一目录中“修改” sound.rs
,而在sound.rs
中,它必须从以下目录中“修改” instrument.rs
:子目录
答案 0 :(得分:3)
在标准的Rust bin项目中,src/main.rs
被指定为板条箱根。 src/
中的其他源文件是板条箱的顶层模块。具有多个文件的模块可以采用以下两种形式之一。旧的方式是这样的:
├── main.rs
└── mod_name
└── mod.rs
└── submodule.rs
└── some_other_mod.rs
mod.rs
是必需的(具有确切名称),它将用作模块的顶层。在这种情况下,您可以确定,src/mod_name/mod.rs
直接引用some_other_mod
而不用super::
或crate::
作为前缀是没有意义的。
您正在使用的新方法允许您放弃mod.rs
,而在父mod目录中仅拥有mod_name.rs
,其目的与mod.rs
相同。当您开始将库作为单个文件开发,然后在以后决定添加更多文件时,不需要重新命名和移动顶级文件,这非常方便。
对于您来说,instrument.rs
必须位于sound/
目录中,才能被视为sound
模块的一部分。如果将其直接放置在src/
中,它将被视为包装箱中的顶层模块。