我想在这里补充一下如何在Rust中包含深度嵌套的文件。 我有以下结构:
|-----main.rs
|-----home/
|---------bathroom/
|-----------------sink.rs
|-----------------toilet.rs
如何从main.rs
访问sink.rs
或toilet.rs
?
正如其他人提到的,Rust不知道文件。相反,它将所有内容视为模块和子模块。要访问浴室目录中的文件,您需要导出它们或在顶部加上barrel。您可以通过在文件中指定文件名以及不带rs扩展名的目录中的文件名 pub mod filename_inside_the_dir_without_rs_ext
来实现这一点。
例如。
pub fn run() {
println!("Wash my hands for 20 secs!");
}
pub fn run() {
println!("Ahhh... This is sooo relaxing.")
}
在home
目录下创建一个名为bathroom.rs
的文件:
导出文件名:
pub mod sink;
pub mod toilet;
创建一个名为home.rs
的文件,放在main.rs
旁边
pub mod
bathroom.rs
文件
// home.rs
pub mod bathroom;
在 main.rs
文件中
mod home;
fn main() {
home::bathroom::sink::run();
}
use
语句也可以使用:
use home::bathroom::{sink, toilet};
fn main() {
sink::run();
sink::toilet();
}
在子模块中包含其他同级模块(文件)
如果你想在toilet.rs
中使用sink.rs
,可以通过指定self
或super
关键字来调用模块。
use self::sink;
pub fn run() {
sink::run();
println!("Ahhh... This is sooo relaxing.")
}
最终目录结构
你将得到类似于这样的东西:
|-----main.rs
|-----home.rs
|-----home/
|---------bathroom.rs
|---------bathroom/
|-----------------sink.rs
|-----------------toilet.rs
上面的结构只适用于Rust 2018及以后版本。下面的目录结构也适用于2018,但这是2015年的工作方式。
|-----main.rs
|-----home/
|---------mod.rs
|---------bathroom/
|-----------------mod.rs
|-----------------sink.rs
|-----------------toilet.rs
home/mod.rs
与./home.rs
相同,home/bathroom/mod.rs
与home/bathroom.rs
相同。Rust进行了此更改,因为编译器会因为包含与目录同名的文件而感到困惑。2018年版(首先显示的版本)修复了这个结构。
有关更多信息,请参见此存储库,并查看此YouTube视频以获取整体说明。
还有一件事...避免使用连字符!请改用snake_case
。
重要提示
您必须将所有文件都列在最上面,即使顶层文件不需要深度文件。
这意味着,为了让sink.rs
发现toilet.rs
,您需要通过上述方法将它们全部列出,直到main.rs
!
换句话说,在toilet.rs
内执行pub mod sink;
或use self::sink;
将不起作用,除非您已将它们全部公开到main.rs
!
因此,请记得将您的文件罗列到顶部!
foo::bar::Baz
结构体应该定义在foo/bar.rs
或foo/bar/mod.rs
中。 - Chris Morgancrate_name::module::foo::Foo
,反复出现,而且还带着过于冗长、无用、重复的描述…… 在Rust领域中,由于难以理解的原因,希望使用目录来组织文件,并将类/结构体/特性/接口等逻辑分割到不同文件中被认为是“异常”的事实,实在令人不安,我个人觉得。 - Joey Sabey