Jon*_*tte 8 module file rust rust-crates
我正在尝试一些 Rust,但我的程序变得有点长。我现在想将我的程序分成许多文件 - 我如何最轻松地做到这一点?
当我尝试用 Google 搜索时,我得到的 Rust 书籍章节有很多关于包、板条箱和模块的页面,而且似乎永远没有说到重点——难道没有更简单的方法来做到这一点吗?
Jon*_*tte 19
当你开始编写 Rust 时,你开始编写一段时间,然后你的 main.rs 或 lib.rs 变得有点长,你想将它分成许多文件。然而,Rust 书开始讨论板条箱、模块和包,并在诸如“内联模块”之类的内容上花费了很多页,这对您根本没有帮助,并且网络上的大多数教程似乎都重复了同样的方法。
但是,您是一位经验丰富的程序员。您已经发布了一些 Java、C++ 和 Javascript 代码,如果幸运的话,也许还可以使用 Haskell、Erlang 或 ML。您要做的就是分成main.rs多个文件并继续。你做什么工作?
您的src/目录及其main.rs文件lib.rs称为 crate。板条箱是 Rust 编译器的翻译单元。然而,“模块”是比板条箱还要小的东西。一般来说,每个源文件都是它自己的模块,它们都需要从主文件中引用(main.rs对于程序,lib.rs对于库)。您的Cargo.toml文件不关心这一点——它都是从主文件中定义的。
与主文件同级的每个文件都是其自己的模块。您需要使用构造来引用/定义它作为包的一部分mod filename;(不要.rs在模块名称中包含该位。)然后,您可以使用模块名称作为前缀:来引用文件内的符号let x = filename::function();。最后,所有符号(类型、函数,甚至结构中的字段)都需要公开,以便pub在模块外部可见。
// main.rs
mod somefile;
fn main() {
let mut x = somefile::make_thing();
x.value = 3;
}
// somefile.rs
pub struct Thing {
pub value : usize;
pub other : f32;
}
pub fn make_thing() -> Thing {
return Thing {
value : 3,
other: 0.1415,
};
}
Directory structure:
myprogram/
Cargo.toml
src/
main.rs
somefile.rs
Run Code Online (Sandbox Code Playgroud)
定义从 main 中使用的同级模块后,mod somefile;您还可以使用withuse将名称导入到本地命名空间中。use只是关于命名空间/别名,但它本身并不导入其他文件/模块。如果需要,您可以避免use somefile::*;添加somefile::前缀,但仍然需要pub为要使用的所有符号添加声明。就我个人而言,我更喜欢显式模块名称,然后在模块本身内使用较短的函数名称进行补偿,因为冲突的风险较小。
模块也可以从包的顶部开始命名,使用use crate::path::modulename;它特别有用,因为模块可以具有基于文件中内联的子目录和/或内部模块声明的路径(用双冒号分隔)。
希望这很简洁,但足以让您继续下去。这个片段并不是故事的全部——现在您可以继续前进一点,直到您需要别名和模块/板条箱分离的全部功能,此时,希望 Rust 书能让您走得更远!