Rust 模块化:深入了解 Rust 中的代码组织

简介: 关键字`mod、pub、crate、self、super、use`都表示什么含义,如何使用?

本文是一篇Rust基础文章,如果下面的问题对你不是问题,就不要浪费时间阅读这篇文章了,做些更有意义的事情吧。

关键字mod、pub、crate、self、super、use都表示什么含义,如何使用?

模块化

模块化是对代码一层一层的封装。面向对象语言中提供的class也算是一种模块化技术,有些语言使用namespace定义的命名空间也是一种模块化技术,让我们看看Rust中的模块化是如何设计的。

本文基于示例项目rust-mod讲解,目录结构如下:

│  Cargo.lock
│  Cargo.toml
│  crate.json
│
├─json
│  │  Cargo.toml
│  │
│  └─src
│      │  json_decode.rs
│      │  json_encode.rs
│      │  lib.rs
│      │
│      └─codec
│              handle.rs
│              mod.rs
│
├─src
│      main.rs
│
└─xml
    │  Cargo.toml
    │
    └─src
            lib.rs

根目录下是一个workspace项目,对于workspace陌生可以看上篇文章《# workspace详解》,我们使用Root package这种方式定义根项目,它依赖json和xml两个crate。

在Rust中模块有 4 种方式表示:

  • crate可以表示一个模块
  • 文件夹也可以表示模块
  • 文件也可以表示模块
  • 文件内使用关键字mod定义模块,并且可以嵌套

1. 用crate表示模块

我们使用命令cargo new创建的项目是一个crate。其它语言中通常叫做package,例如java中的jar package,js中的npm package。因此,我们可以把rust中的依赖包叫做crate package,但Rust社区中习惯上都是叫crate。

在根项目的Cargo.toml中引入依赖:

# /Cargo.toml
[dependencies]
json={path = "./json",version = "0.1.0"}
// src/main.rs
fn main() {
   
    json::encode("1111");
    println!("Hello, world!");
}

加入依赖之后,我们就可以在代码中使用json::__的方式来调用json模块内部公开的方法或结构了。

关键字use

// src/main.rs
use json::*;
use crate::codec::handle::codec as ff;

fn main() {
   
    encode("1111");
    println!("Hello, world!");
}

使用use json::*批量引入json模块中的全部方法或结构,这样我们就可以直接调用encode方法了。使用use关键字可以减少重复写模块名的次数,类似其它语言中的import引入包名的作用。使用as关键字可以给模块定义一个别名。

关键字crate、super、self

我们类比Linux中文件路径的概念:

  • crate相当于根 '/',当前包的根路径,配合use关键字可以引入绝对路径。
  • super相当于 ‘../’,当前模块的上一级路径。
  • self相当于 './',就表示当前模块,通常省略。

2. 文件或文件夹表示模块

要把文件或文件夹作为模块,需要在lib.rs/main.rs/mod.rs文件中进行声明,例如在/json/src/lib.rs中声明了三个模块,在json/src/codec/mod.rs中声明了一个模块。

// json/src/lib.rs
mod json_encode;
mod json_decode;
mod codec;

// json/src/codec/mod.rs
pub mod handle;

其中json_encode和json_decode是文件,codec是文件夹。handle是文件。关键字pub 用于标注在模块、方法或结构体上,表示对模块外部公开。

3. 文件内部定义模块

在文件内部定义模块,使用关键字mod

// json/src/json_encode.rs
mod inner_mod {
   
    use crate::codec::handle::codec;

    pub fn encode(s: &String) -> String {
   
        let cc: String = codec(&s);
        println!("private: {}", cc);
        cc
    }
}

mod inner_mod2 {
   

}

pub fn encode(s: &String) -> String {
   
    inner_mod::encode(s)
}

上面定义了模块inner_modinner_mod2,在模块内部可以使用mod无限嵌套模块,。

总结

最好结合代码仓库rust-mod来理解本文内容。如果你也喜欢Rust,欢迎加微code2c交流。

模块是一种组织代码的方式,允许你将相关的功能分组在一起,提高代码的可读性和可维护性。通过mod关键字,你可以在Rust中创建模块并构建模块层次结构。本文知识点如下,看看你都掌握了吗?

  1. 四种模块类型分别是crate、文件、文件夹、文件内部使用mod定义
  2. pub关键字用于公开模块内部的各种结构
  3. use关键字类似与其他语言的import,引入模块路径。
  4. self、super、crate结合Linux中相对/绝对路径概念来理解。
相关文章
|
20天前
|
存储 Rust 监控
Rust代码编写高性能屏幕监控软件的核心算法
本文介绍了使用Rust编写的高性能屏幕监控软件的实现方法。核心算法包括:1) 使用`image`和`winit`库捕获并转换屏幕图像;2) 对图像进行处理,检测特定对象或活动;3) 利用Rust的并发性并行处理多个帧以提高效率;4) 提取数据后,通过`reqwest`库自动提交到网站进行分析或存储。通过结合Rust的高性能和丰富的库,可构建满足各种需求的高效屏幕监控工具。
65 5
|
3月前
|
Rust 安全 编译器
Rust中的Raw Pointers与不安全代码:深入探索与最佳实践
本文旨在探讨Rust编程语言中Raw Pointers(原始指针)的使用场景以及如何安全地编写不安全代码。我们将深入了解Raw Pointers的定义、工作原理以及它们在Rust中的用途,同时还将讨论编写不安全代码的最佳实践和注意事项,以确保代码的稳定性和安全性。
|
3月前
|
Rust 安全 编译器
Rust中的不安全代码:挑战与注意事项
Rust语言以其内存安全和性能优势著称,但在某些情况下,开发者可能需要使用不安全代码。本文将探讨Rust中不安全代码的使用场景,并详细分析使用不安全代码时需要注意的关键事项,以确保代码的安全性和稳定性。
|
12月前
|
存储 机器学习/深度学习 Rust
Rust 快速入门60分① 看完这篇就能写代码了
Rust 快速入门60分① 看完这篇就能写代码了
332 1
|
Rust C++
Rust语言入门以及代码示例
Rust语言是一种系统级编程语言,它具有高性能、安全性和并发性。Rust的设计目标是为了解决C++语言中存在的安全问题和内存泄漏等问题。Rust语言由Mozilla开发,并于2010年首次发布。
375 0
Rust语言入门以及代码示例
|
Rust 编译器
Rust中如何复用代码?
Rust中如何复用代码?
|
存储 Rust 安全
历时四年,Dropbox 用 Rust 重写同步引擎核心代码
过去四年,我们一直在努力重构 Dropbox 桌面客户端同步引擎,这是 Dropbox 文件夹背后的重要技术,也是 Dropbox 最古老、最重要的代码之一。经过四年努力,我们已经向所有 Dropbox 用户发布了用 Rust 写的新同步引擎(代号为 “Nucleus” )。
|
4月前
|
Rust 安全 网络协议
Rust 笔记:Rust 语言中的枚举 与 模式匹配
Rust 笔记:Rust 语言中的枚举 与 模式匹配
48 0
|
4月前
|
存储 Rust 安全
Rust 笔记:Rust 语言中的 所有权 与 生命周期
Rust 笔记:Rust 语言中的 所有权 与 生命周期
136 0