Jon*_*tte 7
当你开始写 Rust 时,你会先写一段时间,然后你的 main.rs 或 lib.rs 会有点长,你想把它分成很多文件。然而,Rust 书开始谈论 crates、模块和包,并在诸如“内联模块”之类的东西上花费页面和页面,这对您根本没有帮助,并且网络上的大多数教程似乎都在重复同样的方法。
但是,您是一位经验丰富的程序员。你已经发布了一些 Java、C++ 和 Javascript 代码,如果幸运的话,可能还有 Haskell、Erlang 或 ML。您要做的就是拆分main.rs
为多个文件并继续前进。你做什么工作?
备忘单
您的src/
目录及其main.rs
或lib.rs
文件称为 crate。crate 是 Rust 编译器的翻译单元。但是,“模块”比板条箱还小。一般来说,每个源文件都是它自己的模块,它们都需要从主文件中引用(main.rs
对于程序,lib.rs
对于库)。您的Cargo.toml
文件并不关心这一点——它都是从主文件中定义的。
作为主文件的对等文件的每个文件都是它自己的模块。您需要使用构造将其引用/定义为板条箱的一部分mod filename;
(不要.rs
在模块名称中包含该位。)然后您在文件中以模块名称作为前缀引用符号:let x = filename::function();
. 最后,所有符号(类型、函数,甚至结构中的字段)都需要公开,pub
以便在模块外可见。
简单示例
// main.rs
use 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
其他有用的建议
在将同级模块定义为从 main 中使用后,mod somefile;
您还可以使用use
将名称导入本地命名空间。use
仅与命名空间/别名有关,但它本身并不导入其他文件/模块。如果需要,您use somefile::*;
可以避免添加somefile::
前缀,但您仍然需要为pub
要使用的所有符号添加声明。就个人而言,我更喜欢显式的模块名称,然后在模块本身中使用更短的函数名称来弥补,因为冲突的风险更小。
模块也可以从 crate 的顶部开始命名,使用use crate::path::modulename;
它特别有用,因为模块可以具有基于文件中内联的子目录和/或内部模块声明的路径(由双冒号分隔)。
希望这很简洁,但足以让你继续前进。这个片段并不是故事的全部——现在你可以继续走得更远,直到你需要别名和模块/箱分离的全部力量,在这一点上,希望 Rust 书能让你走得更远!
更多推荐
多个,如何将,文件,程序,Rust
发布评论