从 C++ 走向 rust(三):代码组织 —— package、module

本文深入浅出地介绍了Rust语言中的package和module概念。通过实例展示了如何创建和组织代码,包括使用mod关键词定义模块,用单独文件及文件夹定义模块,并利用use简化引用路径。对比了Rust与C++在模块管理上的差异,强调Rust的简洁性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读了些文章和教程,我觉得都搞得太复杂了,没有把 package 包和 module 模块的概念解释清楚。本文彻底简化一下,把主要脉络梳理清楚,帮助初学者迅速掌握相关概念。

1. package

命令 cargo new hello 创建一个名称为 hello 的 package。

$ cargo new hello
	Created binary (application) `hello` package

该命令创建了下列文件,其中最重要的是 src/main.rsCargo.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 和其他新一代程序设计语言一样,果断舍弃了头文件,简化的程序设计的管理。

rustc++
mod#include
useusing namespace

原创不易,如果对您有帮助,请关注、点赞,谢谢支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许野平

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值