我有一个货物项目,包含同一目录中的三个文件:main.rs
,mod1.rs
和mod2.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
因为它在任何地方都不作为模块存在,我不想修改目录结构。
答案 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;