读了些文章和教程,我觉得都搞得太复杂了,没有把 package 包和 module 模块的概念解释清楚。本文彻底简化一下,把主要脉络梳理清楚,帮助初学者迅速掌握相关概念。
1. package
命令 cargo new hello
创建一个名称为 hello 的 package。
$ cargo new hello
Created binary (application) `hello` package
该命令创建了下列文件,其中最重要的是 src/main.rs
和 Cargo.toml
。
rust 的 package 代表一个可编译成二进制代码的工程,相当于 C++ 的 project 项目。新创建的 package 的 src/main.rs 默认源代码如下:
fn main() {
println!("Hello, world!");
}
为便于后面的讨论,我改写一下,加入一个函数 say_hello。源代码如下:
fn say_hello() {
println!("Hello, world!");
}
fn main() {
say_hello();
}
2. module
2.1 用 mod 关键词定义模块
可以把 say_hello 函数放入模块 greeting 中,代码改写如下:
src/main.rs:
mod greeting {
pub fn say_hello() {
println!("Hello, world!");
}
}
fn main() {
greeting::say_hello();
}
mod 关键词定义了一个模块,看起来有一点像 c++ 的 namespace。
注意,say_hello 前面加上了 pub 关键字,表示这个函数是公开的。如果不加这个符号的话,函数只能在模块 greeting 内部使用。
2.2 用单独的文件定义模块
也可以用一个单独的文件 greeting.rs 定义模块 greeting。源代码如下:
src/greeting.rs:
pub fn say_hello() {
println!("Hello, world!");
}
src/main.rs:
mod greeting;
fn main() {
greeting::say_hello();
}
编译器哪里去找 greeting?这个需要在模块 greeting.rs 所在文件夹的“根”代码文件中说明。
- 如果当前 package 目标代码是可执行文件,如windows下的exe文件,src文件夹下面的根代码文件是 main.rs。因此,上面的 main.rs 中加入了 mod greeting 的声明。
- 如果当前 package 目标代码是库文件,src文件夹下面的根代码文件是 lib.rs。
2.3 用文件夹定义模块
当然也可以用文件夹来定义模块。创建 greeting 文件夹,其中再创建 morning.rs、night.rs 两份源代码文件。代码如下:
src/greeting/morning.rs:
pub fn good_morning() {
println!("Good morning!");
}
src/greeting/night.rs:
pub fn good_night() {
println!("Good night!");
}
src/greeting/mod.rs: 只有存在这个文件,当前文件夹才能成为 module。
pub mod morning;
pub mod night;
src/main.rs:
mod greeting;
fn main() {
greeting::morning::good_morning();
greeting::night::good_night();
}
可见,文件夹、文件和 mod 可以组成一层层模块的嵌套。
3. use …
可以用 use 简化引用路径,这一点类似 c++ 的 using namespace。上面的 main.rs 可以改写如下:
mod greeting;
use greeting::morning;
use greeting::night::*;
fn main() {
morning::good_morning();
good_night();
}
上面的代码中,注意 morning 和 night 的 use 方式不一样,后面对应的使用方法也各不一样。
其他相关的内容暂不讨论,有了这些知识,应该对 rust 语言对于 package、module 有了一个大致的认识,作为一般开发足够用了。
4. rust 与 c++ 在模块管理的区别
c++的头文件与代码文件分开的做法,实在带来不少麻烦。当年学习 delphi 的时候,就觉得 delphi 的 unit 比 c++ 的头文件和代码文件的方式效率高很多,无论写代码还是编译, delphi 秒杀 c++。
rust 和其他新一代程序设计语言一样,果断舍弃了头文件,简化的程序设计的管理。
rust | c++ |
---|---|
mod | #include |
use | using namespace |
原创不易,如果对您有帮助,请关注、点赞,谢谢支持!