Rust 学习
Rust 学习
介绍
WIP…
Rust、Julia、Fortran 没有类的概念
参考资料
Rust 练习:
- GitHub - feint123/code-search: a command code tools of search
- 【编程】用rust写了一个超好用的命令行代码搜索工具!_哔哩哔哩_bilibili
库
类似 Python Pandas:GitHub - pola-rs/polars: Dataframes powered by a multithreaded, vectorized query engine, written in Rust
命令行参数解析:GitHub - google/argh: Rust derive-based argument parsing optimized for code size
使用
Rust 环境安装
- rustup | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
- Rust Toolchain 反向代理使用帮助 — USTC Mirror Help 文档
1 | # 方式 1 |
1 | # 运行简单脚本 |
Cargo
cargo 相关命令
1 | cargo --list # 查看所有安装的命令 |
修改 Rust 的下载镜像为国内的镜像地址:创建或编辑 $HOME/.cargo/config.toml
1 | [source.crates-io] |
- 清华大学镜像 - crates.io-index.git、Rust Crates 源使用帮助 — USTC Mirror Help 文档
- cargo 1.68 版本开始支持稀疏索引:不再需要完整克隆 crates.io-index 仓库,可以加快获取包的速度
- 注:添加镜像后,会无法使用
cargo search
民令
项目:
1 | # 创建项目 |
cargo run
相当于运行了编译 cargo build
和运行 ./target/debug/XXX
两个步骤
默认是 debug
模式,代码编译速度快,运行速度慢;提高代码性能:添加 --release
编译
1 | cargo run --release |
项目结构
1 | ├── .git |
Cargo.toml
:项目数据描述文件
Cargo.lock
:项目依赖详细清单
若项目是一个可运行的程序时,可上传 Cargo.lock
;若是一个依赖库项目,建议将其添加到 .gitignore
中
Cargo.toml
设置
1 | # package 配置 |
项目依赖
工具
Rust 相关 VSCode 插件:rust-analyzer
cargo-update:检查和更新 package 的 cargo 子命令
1 | cargo install cargo-update # 安装 |
- cargo-cache:cargo 缓存管理工具
1 | cargo install cargo-cache # 安装 |
- rust-binstall
1 | # 安装 |
- 一次性更新所有软件包(跨平台):GitHub - topgrade-rs/topgrade: Upgrade all the things
1 | brew install topgrade # 安装 |
- 在 Rust 中使用 REPL 和 Jupyter 内核:GitHub - evcxr/evcxr
语法
变量
1 | let x = 5; |
若创建了一个变量却不在任何地方使用它,Rust 通常会给你一个警告,因为这可能会是个 BUG
基本类型
Rust 编译器可以根据变量的值和上下文中的使用方式来自动推导出变量的类型
浮点类型:f32
和 f64
,默认浮点类型是 f64
NaN 类型
序列:1..5
,生成从 1 到 4 的连续数字,不包含 5;1..=5
,生成从 1 到 5 的连续数字,包含 5
1 | for i in 1..=5 { |
字符 ''
,字符串 ""
单元类型:()
main
函数就返回单元类型
没有返回值的函数在 Rust 中有单独定义
1 | // 类型注释 |
语句:加分号 ;
,表达式:不加分号 ;
Rust 是强类型语言,每个函数参数都需要标注类型,函数的位置可以随便放
- **垃圾回收机制 (GC)**,在程序运行时不断寻找不再使用的内存,典型代表:Java、Go
- 手动管理内存的分配和释放, 在程序中,通过函数调用的方式来申请和释放内存,典型代表:C++
- 通过所有权来管理内存,编译器在编译时会根据一系列规则进行检查
Rust 中的字符是 Unicode 类型,每个字符占据 4 个字节内存空间;在字符串中不一样,字符串是 UTF-8 编码,字符串中的字符所占的字节数是变化的 (1 - 4),如中文在 UTF-8 中占用三个字节
str
类型是硬编码进可执行文件,也无法被修改,但是 String
则是一个可增长、可改变且具有所有权的 UTF-8 编码字符串。当 Rust 用户提到字符串时,往往指的就是 String 类型和 &str 字符串切片类型,这两个类型都是 UTF-8 编码
元组
1 | fn main() { |
用 .
获取元组中的值
结构体
1 | struct User { |
1 | let user1 = User { |
- 初始化实例时,每个字段都需要进行初始化
- 初始化时的字段顺序不需要和结构体定义时的顺序一致
用 .
访问结构体实例内部的字段值
使用 #[derive(Debug)]
来打印结构体的信息
1 |
|
数组 array
1 | if condition == true { |
模式匹配: match
和 if let
1 | match target { |
1 | impl |
代码注释
1 | // 行注释 |
文档注释
1 | /// 文档行注释 |
!
:宏操作符
Rust 的集合类型不能直接进行循环,需要变成迭代器(可用 .iter()
方法),才能用于迭代循环
随机数:rand
参数解析
clap
库
1 | cargo add clap --features derive |