当前位置: 首页 > news >正文

Rust 学习笔记(卷二)

文章目录

  • Rust 学习笔记(卷二)
    • 八、工程
      • 1. package 和 crate
        • package 总览
        • 包根(crate root)
      • 2. 模块
        • 初识模块
        • 单个源文件中的嵌套模块
        • 使用具有层级结构的源文件构造嵌套模块
      • 3. 文档
      • 4. 使用第三方包
      • 5. 打包自己的包
    • 九、标准库
    • 十、多线程的并发编程
    • 十一、“不安全”编程
        • unsafe 代码块
        • 全局变量与静态变量
        • 内部可变性

Rust 学习笔记(卷二)

八、工程

相比以前的 C++,Rust 提出了包和模块的概念,使工程管理变得更加有组织。下面我们会自顶向下的介绍 Rust 中有关工程的概念。

1. package 和 crate

package 总览

Rust 工程管理中,最大的概念是 package,其次是 crate。Rust 的 crate 可以是一个库,也可以是一个可执行文件,而 package 的作用则是将一个或多个 crate 组织起来。

Package 是使用 Cargo.toml 文件管理的,这是我们所熟悉的,而 crate 则有组织地被放在项目文件夹中,包括:

  1. 库包。需要存在 src/lib.rs 源文件。包名与项目名相同。一个项目只能有一个库包。
  2. 可执行文件包。需要存在 src/main.rs 源文件。包名与项目名相同。
  3. 更多可执行文件包。每个 src/bin/ 中的源文件都是一个包,包名与文件名相同。

对比 C++ 来看,package 可以看作 CMake 的 project,而 crate 可以看作 CMake 的 target。

包根(crate root)

前面提到,如果一个 package 包含唯一的库包0,则需要存在 src/lib.rs 文件;对于可执行文件包则需要存在 src/main.rs。像这种一个源文件代表一个 crate 的,我们称为包根(crate root)。

包根只是一个源文件,那多个源文件该怎么办?方法是借助模块。模块的机制允许我们将包内的代码放在多个源文件中。

2. 模块

初识模块

Rust 中,与模块相关的关键字是 mod

Rust 程序 79:mod
// src/orange.rs
pub fn hello() {println!("Hello, orange!");
}
// src/main.rs
mod orange;
use orange::hello;
fn main() {hello();
}
C++ 程序 79:module
// orange.cpp
export module orange; // 手动写明,与文件名本身无关。
import std;
namespace orange { // 手动创建命名空间,与模块无关。export void hello() {std::cout << "Hello, orange!" << std::endl;}
}
// 源.cpp
import orange;
using orange::hello;
int main() {hello();
}

关于 Rust 程序 79 的新东西有:

  1. pub 关键字。如果要使用的东西不属于自己的父模块(例如程序 79 中,orange 模块和 main 模块是兄弟,orange 模块不是 main 模块的父模块),则只能使用公开的模块,用 pub 关键字表示。这和 C++ 程序 79 中 hello 函数前的 export 关键字一样。
  2. mod 关键字。其功能是在包根所在目录查找指定名字的源文件,并将源文件中的内容视为位于同名模块中(例如程序 79 中,在包根 main.rs 同目录下找到了 orange.rs,将 orange.rs 中的内容视为位于模块 orange 中)。
  3. use 关键字。一旦模块进入视野内(例如程序 79 中通过 mod 语句在当前位置声明了一个模块,又如通过配置依赖项已经引入了外部模块),则可以使用 use 语句引入模块里的内容。使用 use 语句引入内容的可见性将在之后讲解。

与 C++ 要求必须在单独的文件里定义模块不同,Rust 中允许在同一个源文件里定义模块。所以 Rust 的模块更像是 C++ 的模块和命名空间的结合体。

Rust 程序 80:只有包根
mod orange {pub fn hello() {println!("Hello, orange!");}
}
use orange::hello;
fn main() {hello();
}
C++ 程序 80:假装是模块
import std;
namespace orange { // 只有命名空间,没有模块。void hello() {std::cout << "Hello, orange!" << std::endl;}
}
using orange::hello;
int main() {hello();
}

Rust 程序 80 中,mod 块前没有再加 pub,这是因为我们在下面使用它时已经能够看到它的完整实现了,所以没有必要再加上 pub

单个源文件中的嵌套模块

使用具有层级结构的源文件构造嵌套模块

3. 文档

4. 使用第三方包

5. 打包自己的包

九、标准库

十、多线程的并发编程

并发、异步。

十一、“不安全”编程

unsafe 代码块

全局变量与静态变量

理论上,全局变量越少越好,以防形成一盘散沙之势。然而,全局变量通常也是无法避免的,例如在使用单例设计模式时。

内部可变性

http://www.lryc.cn/news/142360.html

相关文章:

  • android amazon 支付接入
  • Vue2-快速搭建pc端后台管理系统
  • 【产品文档】团队介绍PPT模板
  • 组件库的使用和自定义组件
  • 网站和API支持HTTPS,最好在Nginx上配置
  • UnitTest笔记: 拓展库DDT的使用
  • 裂缝检测,只依赖OPENCV,基于YOLO8S
  • python编程环境使用技巧3-程序打包pyinstaller
  • Go 自学:defer关键字
  • 【云计算】Docker特别版——前端一篇学会
  • .net使用RabbitMQ小记
  • layUI 中 穿梭框无法获取值的细节问题
  • Kaggle回归问题Mercedes——Benz Greener Manufacturing
  • 天润融通「微藤大语言模型平台2.0」以知识驱动企业高速增长
  • 【BUG】解决安装oracle11g或12C中无法访问临时位置的问题
  • 2. 使用IDEA创建Spring Boot Hello项目并管理依赖——Maven入门指南
  • Python在电路课程中的应用
  • Spark SQL join的三种实现方式
  • wazuh环境配置和漏洞复现
  • 九五从零开始的运维之路(其三十六)
  • 同步和异步有什么区别,使用场景?
  • webassembly009 transformers.js 网页端侧推理
  • Android动态添加和删除控件/布局
  • maven下载不了仓库地址为https的依赖jar,配置参数忽略ssl安全检查
  • 3.Redis 单线程模型
  • 0基础学习VR全景平台篇 第90篇:智慧眼-数据统计
  • 【Go】Goland项目配置运行教程
  • Docker容器与虚拟化技术:Docker consul 实现服务注册与发现
  • 【大模型AIGC系列课程 2-2】大语言模型的“第二大脑”
  • Java基础数据结构