Rust 官网:https://www.rust-lang.org/zh-CN/
1、Rust 简介
Rust 是一门注重安全(safety)、速度(speed)和并发(concurrency)的现代系统编程语言。Rust 通过内存安全来实现以上目标,但不使用垃圾回收机制(garbage collection, GC)。
Rust 特点
- 高性能:Rust 速度惊人且内存利用率极高。由于没有运行时和垃圾回收,它能够胜任对性能要求特别高的服务,可以在嵌入式设备上运行,还能轻松和其他语言集成。
- 可靠性:Rust 丰富的类型系统和所有权模型保证了内存安全和线程安全,让您在编译期就能够消除各种各样的错误。
- 生产力:Rust 拥有出色的文档、友好的编译器和清晰的错误提示信息, 还集成了一流的工具——包管理器和构建工具, 智能地自动补全和类型检验的多编辑器支持, 以及自动格式化代码等等。
Rust 相关概念
- channel:Rust 会发布3个不同版本:stable、beta、nightly。
stable:Rust 的稳定版本,每 6 周发布一次。
beta:Rust 的公开测试版本,将是下一个 stable 版本。
nightly:每天更新,包含以一些实验性的新特性。 - toolchain:一套 Rust 组件,包括编译器及其相关工具,并且包含 channel,版本及支持的平台信息。
- target:指编译的目标平台,即:编译后的程序在哪种操作系统上运行。
- component (组件):toolchain 是由 component 组成的。查看所有可用和已经安装的组件命令如下:rustup component list。rustup 默认安装的组件:
rustc:Rust 编译器。
rust-std:Rust 标准库。
cargo:包管理和构建工具。
rust-docs:Rust 文档。
rustfmt:用来格式化 Rust 源代码。
clippy:Rust 的代码检查工具。 - profile:为了方便对 component 进行管理,使用 profile 定义一组 component。不同的 profile 包含不同的组件,安装 rustup 时有三种 profile 可选,修改 profile 命令如下:rustup set profile minimal
- Rustup 是什么:Rustup 是 Rust安装器和版本管理工具。安装 Rust 的主要方式是通过 Rustup 这一工具,它既是一个 Rust 安装器又是一个版本管理工具。Rust 的升级非常频繁。运行
rustup update
获取最新版本的 Rust。文档:https://rust-lang.github.io/rustup/ - Cargo 是什么:Cargo 是 Rust 的 构建工具 和 包管理器。安装 Rustup 时会自动安装。Cargo 可以做很多事情:
cargo build 可以构建项目
cargo run 可以运行项目
cargo test 可以测试项目
cargo doc 可以为项目构建文档
cargo publish 可以将库发布到 crates.io。
检查是否安装了 Rust 和 Cargo,可以在终端中运行:cargo --version
下载、安装
下载:https://www.rust-lang.org/tools/install
安装:https://www.rust-lang.org/zh-CN/learn/get-started
默认情况,Rust 依赖 C++ build tools,没有安装也关系。安装过程需要保证网络正常。
在 Rust 开发环境中,所有工具都安装在 ~/.cargo/bin 目录中,可以在这里找到包括 rustc、cargo 和 rustup 在内的 Rust 工具链。在安装过程中,rustup 会尝试配置 PATH,如果 rustup 对 PATH 的修改不生效,可以手动添加路径到 PATH
~/.cargo/bin
~/.rustup/bin
以下是一些常用的命令:
rustup 相关
rustup -h # 查看帮助
rustup show # 显示当前安装的工具链信息
rustup update # 检查安装更新
rustup self uninstall # 卸载
rustup default stable-x86_64-pc-windows-gnu # 设置当前默认工具链rustup toolchain list # 查看工具链
rustup toolchain install stable-x86_64-pc-windows-gnu # 安装工具链
rustup toolchain uninstall stable-x86_64-pc-windows-gnu # 卸载工具链
rustup toolchain link <toolchain-name> "<toolchain-path>" # 设置自定义工具链rustup override list # 查看已设置的默认工具链
rustup override set <toolchain> --path <path> # 设置该目录以及其子目录的默认工具链
rustup override unset --path <path> # 取消目录以及其子目录的默认工具链rustup target list # 查看目标列表
rustup target add <target> # 安装目标
rustup target remove <target> # 卸载目标
rustup target add --toolchain <toolchain> <target> # 为特定工具链安装目标rustup component list # 查看可用组件
rustup component add <component> # 安装组件
rustup component remove <component> # 卸载组件
rustc 相关
rustc --version # 查看rustc版本
cargo 相关
cargo --version # 查看cargo版本
cargo new <project_name> # 新建项目
cargo build # 构建项目
cargo run # 运行项目
cargo check # 检查项目
cargo -h # 查看帮助
配置工具链安装位置
在系统环境变量中添加如下变量:
CARGO_HOME 指定 cargo 的安装目录
RUSTUP_HOME 指定 rustup 的安装目录
默认分别安装到用户目录下的.cargo 和.rustup 目录
配置国内镜像
配置 rustup 国内镜像。在系统环境变量中添加如下变量(选一个就可以,可以组合):
# 清华大学
RUSTUP_DIST_SERVER:https://mirrors.tuna.tsinghua.edu.cn/rustup
RUSTUP_UPDATE_ROOT:https://mirrors.tuna.tsinghua.edu.cn/rustup/rustup# 中国科学技术大学
RUSTUP_DIST_SERVER:https://mirrors.ustc.edu.cn/rust-static
RUSTUP_UPDATE_ROOT:https://mirrors.ustc.edu.cn/rust-static/rustup
配置 cargo 国内镜像。在 cargo 安装目录下新建 config 文件(注意 config 没有任何后缀),文件内容如下:
[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"
replace-with = 'tuna'# 清华大学
[source.tuna]
registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"# 中国科学技术大学
[source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"
# 设置代理
[http]
proxy = "127.0.0.1:8889"
[https]
proxy = "127.0.0.1:8889"
Windows 交叉编译 Linux 程序。目标服务器是 Linux(CentOS 7) 64bit
, 所以我们添加的 target 应该是x86_64-unknown-linux-gnu
(动态依赖) 或者x86_64-unknown-linux-musl
(静态依赖)
- 动态依赖:目标服务器需要包含动态依赖的相关库(用户共享库)
- 静态依赖,目标服务器不需要包含相应的库,但是打包文件会更大些
1). 添加需要的 target
rustup target add x86_64-unknown-linux-musl
2). 在 cargo 安装目录下新建 config 文件(注意 config 没有任何后缀),添加的文件内容如下:
[target.x86_64-unknown-linux-musl]
linker = "rust-lld"
3). 构建
cargo build --target x86_64-unknown-linux-musl
示例:
创建新项目
用 Cargo 创建一个新项目。在终端中执行:cargo new hello-rust,会生成一个名为 hello-rust
的新目录,其中包含以下文件:
Cargo.toml
为 Rust 的清单文件。其中包含了项目的元数据和依赖库。src/main.rs
为编写应用代码的地方。
进入新创建的目录中,执行命令运行此程序:cargo run
添加 依赖
现在来为程序添加依赖。可以在 crates.io,即 Rust 包的仓库中找到所有类别的库。在 Rust 中通常把 "包" 称作 "crates"。在本项目中,使用了名为 ferris-says 的库。
在 Cargo.toml
文件中添加以下信息(从 crate 页面上获取):
[dependencies]
ferris-says = "0.3.1"
下载 依赖
运行:cargo build , Cargo 就会安装该依赖。运行 build 会创建一个新文件
Cargo.lock
,该文件记录了本地所用依赖库的精确版本。
使用 依赖
使用该依赖库:可以打开
main.rs
,删除其中所有的内容(它不过是个示例而已),然后在其中添加下面这行代码:use ferris_says::say;这样就可以使用
ferris-says
crate 中导出的say
函数了。
完整 Rust 示例
现在用上面的依赖库编写一个小应用。在 main.rs
中添加以下代码:
use ferris_says::say; // from the previous step
use std::io::{stdout, BufWriter};fn main() {let stdout = stdout();let message = String::from("Hello fellow Rustaceans!");let width = message.chars().count();let mut writer = BufWriter::new(stdout.lock());say(&message, width, &mut writer).unwrap();
}
保存完毕后,执行命令运行程序:cargo run
成功执行后,会打印一个字符形式的螃蟹图案。
Ferris ( 费理斯 ) 是 Rust 社区的非官方吉祥物。
2、Rust 相关文档
:https://www.rust-lang.org/zh-CN/learn
核心文档
以下所有文档都可以用 rustup doc
命令在本地阅读,它会在浏览器中离线打开这些资源!
标准库
详尽的 Rust 标准库 API 手册。:https://doc.rust-lang.org/std/index.html
版本指南
Rust 版本指南。:https://doc.rust-lang.org/edition-guide/index.html
CARGO 手册
Rust 的包管理器和构建系统。:https://doc.rust-lang.org/cargo/index.html
RUSTDOC 手册
学习如何为 crate 编写完美的文档。:https://doc.rust-lang.org/rustdoc/index.html
RUSTC 手册
熟悉 Rust 编译器中可用的选项。:https://doc.rust-lang.org/rustc/index.html
编译错误索引表
深入解释遇到的编译错误。:https://doc.rust-lang.org/error_codes/error-index.html
Rust 程序
命令行 程序
用 Rust 构建高效的命令行应用。:https://rust-cli.github.io/book/index.html
WEBASSEMBLY 手册
通过 WebAssembly 用 Rust 构建浏览器原生的库。:https://rustwasm.github.io/docs/book/
嵌入式手册
Rust 编写嵌入式程序。:https://doc.rust-lang.org/stable/embedded-book/
3、Rust 程序设计语言
英文文档:https://doc.rust-lang.org/book/
中文文档:https://kaisery.github.io/trpl-zh-cn/
《Rust 程序设计语言》被亲切地称为“圣经”。给出了 Rust 语言的概览。在阅读的过程中构建几个项目,读完后,就能扎实地掌握 Rust 语言。
- 1. 入门指南
-
- 1.1. 安装
- 1.2. Hello, World!
- 1.3. Hello, Cargo!
- 2. 写个猜数字游戏
- 3. 常见编程概念
-
- 3.1. 变量与可变性
- 3.2. 数据类型
- 3.3. 函数
- 3.4. 注释
- 3.5. 控制流
- 4. 认识所有权
-
- 4.1. 什么是所有权?
- 4.2. 引用与借用
- 4.3. Slice 类型
- 5. 使用结构体组织相关联的数据
-
- 5.1. 结构体的定义和实例化
- 5.2. 结构体示例程序
- 5.3. 方法语法
- 6. 枚举和模式匹配
-
- 6.1. 枚举的定义
- 6.2. match 控制流结构
- 6.3. if let 简洁控制流
- 7. 使用包、Crate 和模块管理不断增长的项目
-
- 7.1. 包和 Crate
- 7.2. 定义模块来控制作用域与私有性
- 7.3. 引用模块项目的路径
- 7.4. 使用 use 关键字将路径引入作用域
- 7.5. 将模块拆分成多个文件
- 8. 常见集合
-
- 8.1. 使用 Vector 储存列表
- 8.2. 使用字符串储存 UTF-8 编码的文本
- 8.3. 使用 Hash Map 储存键值对
- 9. 错误处理
-
- 9.1. 用 panic! 处理不可恢复的错误
- 9.2. 用 Result 处理可恢复的错误
- 9.3. 要不要 panic!
- 10. 泛型、Trait 和生命周期
-
- 10.1. 泛型数据类型
- 10.2. Trait:定义共同行为
- 10.3. 生命周期确保引用有效
- 11. 编写自动化测试
-
- 11.1. 如何编写测试
- 11.2. 控制测试如何运行
- 11.3. 测试的组织结构
- 12. 一个 I/O 项目:构建命令行程序
-
- 12.1. 接受命令行参数
- 12.2. 读取文件
- 12.3. 重构以改进模块化与错误处理
- 12.4. 采用测试驱动开发完善库的功能
- 12.5. 处理环境变量
- 12.6. 将错误信息输出到标准错误而不是标准输出
- 13. Rust 中的函数式语言功能:迭代器与闭包
-
- 13.1. 闭包:可以捕获其环境的匿名函数
- 13.2. 使用迭代器处理元素序列
- 13.3. 改进之前的 I/O 项目
- 13.4. 性能比较:循环对迭代器
- 14. 更多关于 Cargo 和 Crates.io 的内容
-
- 14.1. 采用发布配置自定义构建
- 14.2. 将 crate 发布到 Crates.io
- 14.3. Cargo 工作空间
- 14.4. 使用 cargo install 安装二进制文件
- 14.5. Cargo 自定义扩展命令
- 15. 智能指针
-
- 15.1. 使用Box<T> 指向堆上数据
- 15.2. 使用Deref Trait 将智能指针当作常规引用处理
- 15.3. 使用Drop Trait 运行清理代码
- 15.4. Rc<T> 引用计数智能指针
- 15.5. RefCell<T> 与内部可变性模式
- 15.6. 引用循环会导致内存泄漏
- 16. 无畏并发
-
- 16.1. 使用线程同时地运行代码
- 16.2. 使用消息传递在线程间通信
- 16.3. 共享状态并发
- 16.4. 使用Sync 与 Send Traits 的可扩展并发
- 17. Rust 的面向对象编程特性
-
- 17.1. 面向对象语言的特点
- 17.2. 为使用不同类型的值而设计的 trait 对象
- 17.3. 面向对象设计模式的实现
- 18. 模式与模式匹配
-
- 18.1. 所有可能会用到模式的位置
- 18.2. Refutability(可反驳性): 模式是否会匹配失效
- 18.3. 模式语法
- 19. 高级特征
-
- 19.1. 不安全的 Rust
- 19.2. 高级 trait
- 19.3. 高级类型
- 19.4. 高级函数与闭包
- 19.5. 宏
- 20. 最后的项目:构建多线程 web server
-
- 20.1. 建立单线程 web server
- 20.2. 将单线程 server 变为多线程 server
- 20.3. 优雅停机与清理
- 21. 附录
-
- 21.1. A - 关键字
- 21.2. B - 运算符与符号
- 21.3. C - 可派生的 trait
- 21.4. D - 实用开发工具
- 21.5. E - 版本
- 21.6. F - 本书译本
- 21.7. G - Rust 是如何开发的与 “Nightly Rust”
4、通过例子学 Rust
英文文档:https://doc.rust-lang.org/rust-by-example/
中文文档:https://rustwiki.org/zh-CN/rust-by-example/
查看更多 Rust 官方文档中英文双语教程,包括双语版《Rust 程序设计语言》(出版书名为《Rust 权威指南》), Rust 标准库中文版。
《通过例子学 Rust》(Rust By Example 中文版)翻译自 Rust By Example,中文版最后更新时间:2022-1-26。查看此书的 Github 翻译项目和源码。
开始学习吧!
-
Hello World - 从经典的 “Hello World” 程序开始学习。
-
原生类型 - 学习有符号整型,无符号整型和其他原生类型。
-
自定义类型 - 结构体
struct
和 枚举enum
。 -
变量绑定 - 变量绑定,作用域,变量遮蔽。
-
类型系统 - 学习改变和定义类型。
-
类型转换
-
表达式
-
流程控制 -
if
/else
,for
,以及其他流程控制有关内容。 -
函数 - 学习方法、闭包和高阶函数。
-
模块 - 使用模块来组织代码。
-
Crate - crate 是 Rust 中的编译单元。学习创建一个库。
-
Cargo - 学习官方的 Rust 包管理工具的一些基本功能。
-
属性 - 属性是应用于某些模块、crate 或项的元数据(metadata)。
-
泛型 - 学习编写能够适用于多种类型参数的函数或数据类型。
-
作用域规则 - 作用域在所有权(ownership)、借用(borrowing)和生命周期(lifetime)中起着重要作用。
-
特性 trait - trait 是对未知类型(
Self
)定义的方法集。 -
宏
-
错误处理 - 学习 Rust 语言处理失败的方式。
-
标准库类型 - 学习
std
标准库提供的一些自定义类型。 -
标准库更多介绍 - 更多关于文件处理、线程的自定义类型。
-
测试 - Rust 语言的各种测试手段。
-
不安全操作
-
兼容性
-
补充 - 文档和基准测试