Skip to main content
rust 社区

0 Rust 开始

•3 min•456 words
语法不是第一位的,知道自己不知道哪些东西才是第一位的

编程语言的学习,语法并不是第一位的,途径是第一位的。从官方社区开始了解,官方教程途径、Rust应用途径、工具、构建、FAQ等。了解这些途径,尽管你不能第一时间想到问题的解决办法,但你总能想到到哪里能找到问题的解决方案。

Rust官方社区

Rust的代码开源在github上, https://github.com/rust-lang 包括 Rust,Cargo,等等。

学习之前,先设置挑战目标,然后就有兴趣

既然我们有编程基础,那么不要严格按照顺序学习。哪些部分有兴趣,就先学哪部分。保持兴趣最重要。

官方教程

The rust programming作为初学教程

Rust 程序设计语言 简体中文版是开源的《The Rust Programming Language》的社区翻译版本。
Rust圣经提供了另一个版本,其中包括测验、 高亮、可视化等功能: https://rust-book.cs.brown.edu

另外有一个我非常喜欢的Rust中文教程: https://beatai.org/rust-course/about-book
这个教程还提供了一个配套习题:Rust 语言实战,这个练习参考了rust官方的《Rust by Example》,并且有中文版本!我们可以下载到本地浏览器阅读。

更多深入教程、文档

这里有一个文档路线:https://learnku.com/docs/nomicon/2018 点击文档可以看到更多。

结合使用最好

官方的教程不能满足我的好奇心,总是有各种问题。如果阅读官方教程的同时,阅读三方教程,就能保证乐趣和知识系统性。

Rust的安装

Rust提供了专门用于安装与更新Rust的工具,不要使用其他任何安装工具

使用 Rustup(推荐),可以帮助我们更新到最新rust版本,而其他第三方安装工具例如apt、yum之类的无法做到最新版本的更新。
参考官方安装步骤,非常简单:https://rust-lang.org/zh-CN/tools/install/

尝试执行 rustc --version 检测安装情况。

可以执行 rustup update 来升级 Rust。

在任何时候如果您想卸载 Rust,您可以运行 rustup self uninstall

Rust工具链

开发过程总是需要各种各样的工具辅助我们开发

1 代码编辑器支持rust-analyzer
2 包管理、测试、构建 cargo
3 代码格式化 Rustfmt
4 代码错误检测与建议 Clippy
4 文档生成工具 Rustdoc
.
5 rustup 用于下载、管理、查看 rust 编译器
6 rustc Rust的编译器

Rust工具链的位置

在 Rust 开发环境中,所有工具都安装在~/.cargo/bin 目录中,您可以在这里找到包括 rustc、cargo 和 rustup 在内的 Rust 工具链。
.
Rust 开发者通常会将该目录加入 PATH环境变量中。

Cargo是内置的依赖管理器和构建工具,它能轻松增加、编译和管理依赖,并使依赖在 Rust 生态系统中保持一致。

Rustfmt 格式化工具确保开发者遵循一致的代码风格。

Rust Language Server 为集成开发环境(IDE)提供代码补全和内联错误信息功能。

rustup

rustup工具的主要功能:rust安装更新卸载、文档导航

rustup命令行工具,帮助我们自动安装rust,更新rust,卸载rust,查看rust离线文档。

rustup --version # 查看rustup的版本
rustup update # 自动更新到最新的rust稳定版
rustup self uninstall # 卸载rust
rustup doc # 查看rust离线文档,包括rust官方教程、rust工具链文档、标准库文档、指南、rust风格、死岭书等各种能用到的文档都在这里导航
rustup which cargo # 查看cargo命令所在
rustup which rustc # 查看rustc编译器所在
rust的离线文档默认位置

windows默认位置:C:/Users/<user_name>/.rustup/toolchains/stable-x86_64-pc-windows-msvc/share/doc/rust/html/std/index.html

我们可以在本地的离线文档中,获得这些文档的线索:

1 官方教程文档
The Rust Programming Language 文字教程
Rust By Example 提供的案例教程
Rustlings 小型练习,帮你熟悉 Rust 代码的阅读与编写!
2 API文档
rust标准库文档,介绍了rust提供的各种功能的API使用方法

所有能通过crate包公共路径访问的文档注释都能生成文档

特别注意“重导出”也是一个路径

3 工具文档
cargo book
rustc book 另外还有rust error codes rust的编译器的错误码
rustdoc book
clippy book
4 其余
rust的开发参考资料,了解rust的灵感
rust发行日志
rust代码风格
rust unsafe book
rustc开发指南
rust嵌入式指南 book

rustc 编译命令

前置总结

至少我们学会使用rustc编译一个.rs结尾的文件对吗?

rustc <source_rs_file_path> # 编译rs文件,得到同名不同后缀的编译结果文件
release编译优化

待探索,优化程度。

cargo 管理一切

cargo可以组织工具链

cargo不仅管理项目,还管理了众多rust工具,通过cargo进行调用。例如rustdoc通过cargo doc调用,rustfix通过cargo fix调用,rustc通过cargo build调用。

rustdoc 文档生成与部署

rustdoc可以使用 cargo 直接调用,下面都使用cargo调用。

rustdoc 帮助生成和部署crate文档

将代码中的注释,生成标准化crate文档,并生成网站部署。

为当前crate项目生成文档

执行cargo doc,然后在项目目录下回生成doc/子目录。

打开crate文档

cargo doc --open 可以打开当前crate以及所依赖crate的全部文档
==cargo doc --open --no-deps== 可以阻止生成所有依赖的文档,提供文档生成速度。
cargo doc -p <crate-name> --open 可以指定查看某依赖的文档

可以访问 docs.rs 网站,并在搜索框中输入 crate 的名称。

生成文档的结构,以及注释需要保证的语法 0.1 API文档与标准库结构 0.2 rustdoc注释语法

项目管理

项目的生成

cargo new <directy-name> 创建一个目录并将项目结构所需内容新建在目录中。

默认的行为

cargo默认传参 —bin,创建用于生成二进制的源文件,如果传入—lib则创建库文件。
cargo还会初始化一个 Git 仓库,并生成一个.gitignore 文件。如果已存在git仓库则不会继续。

项目结构

cargo可以帮助我们管理项目,我们需要遵守cargo预设目录结构才能让cargo正常管理。所以通常我们通过cargo自动创建合法的cargo项目。

会创建如下所示目录结构:

.
├── Cargo.toml
└── src
    └── main.rs

也就是说src中的main.rs是主入口。
目录下有Cargo.toml的项目 manifest 文件,保存了项目的元数据。

Cargo 期望你的源文件位于 src 目录中。
项目根目录则只用来放 README、license 信息、配置文件,以及其他与代码无关的内容。

手动转换成cargo项目

如果你一开始没有使用 Cargo 创建项目,也可以把它转换成一个使用 Cargo 的项目。只要把项目代码移到src 目录中,并创建一个合适的 Cargo.toml 文件即可。一个简单的办法是运行 cargo init,它会自动为你创建这个文件。

Cargo.toml内容

Cargo.toml主要是包含两部分的配置:[package] 部分,描述项目部分:name、version、edition
[dependencies] 部分,描述依赖:在 Rust 中,代码包被称为 crates。
依赖包可以有三种来源,crates.io官方,直接描述版本即可。github仓库需要指名仓库地址,本地来源需要指明path。

[dependencies]
rand = "0.3"
hammer = { version = "0.5.0"}
color = { git = "https://github.com/bjz/color-rs" }
geometry = { path = "crates/geometry" }
Todo

每个 crate 在 Cargo.toml 里独立声明自己的 edition(默认当前rust版本2024)。

  • 编译器会按各自 Edition 规则分别解析,但最终生成相同的中间表示与二进制接口,可以无缝链接
构建与运行

cargo能调用rustc工具,所以可以构建和运行rust项目。

cargo build --verbose # 编译当前项目,并以详细模式展开
cargo run # 在build之后并运行编译后的可执行程序

D:\Programming\Rust\workspace\rust_study\hello_world > cargo build —verbose
Compiling hello_world v0.1.0 (D:\Programming\Rust\workspace\rust_study\hello_world)
Running C:\Users\xxx\.rustup\toolchains\stable-x86_64-pc-windows-msvc\bin\rustc.exe --crate-name hello_world --edition=2024 src\main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=140 --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debuginfo=2 --check-cfg cfg(docsrs,test) --check-cfg "cfg(feature, values())" -C metadata=fb3d4ca8d9c5efcc --out-dir D:\Programming\Rust\workspace\rust_study\hello_world\target\debug\deps -C incremental=D:\Programming\Rust\workspace\rust_study\hello_world\target\debug\incremental -L dependency=D:\Programming\Rust\workspace\rust_study\hello_world\target\debug\deps
Finished dev profile [unoptimized + debuginfo] target(s) in 1.31s

cargo build默认行为

cargo 会在 target/debug/<项目名> 生成一个可执行文件,而不是当前目录。
默认构建方式是调试构建(debug build),所以放在debug。cargo build --release能进行release构建。
Cargo能发现源文件有没有发生变化,没有变化则不会重复编译

检查而不编译

rust的一大痛点是,编译漫长。所以通常我们并不能随便编译,而是使用快速检查来让编译器检查我们的代码。cargo check 直接在项目目录运行即可。

第三方crate的文档

所有下载的工具、依赖项目都会自带源码与文档

几乎每个工具都会在安装目录附带使用文档docs目录之类的位置。当我们忘记某些内容的时候就能快速通过文档获取详细信息。

cargo install的crate的离线文档

cargo install的crate都会下载源码的,所以我们到 ~/.cargo/registry/src/index.crates.io-xxx 中来看对应的crate的源码仓库中的文档即可。

crate的线上文档

另外一种是线上文档,在rustdoc提供的doc网站上应该能查询到,或者在crates.io网站对应的crate也会提供doc的网站。
.
可以访问docs.rs 网站,并在搜索框中输入 crate 的名称。

包管理

cargo 如何找到我们需要的crate?

Rust 官方提供了公共包注册中心, crates.io。核心目标是作为 Rust 包(crates)的中心化分发平台和永久存档。
 在 Cargo.toml 中添加依赖后,运行 cargo build,Cargo 便会自动从 crates.io 下载所需的包。
 当你完成一个库的开发,可以使用 cargo publish 命令将其发布到 crates.io,供全世界使用。

cargo默认能从crates.io中获取crate索引,提供搜索于添加依赖的功能

cargo search <crate-name>在 crates.io 中搜索类似名字的 crate。
cargo add <crate-name> 在 crates.io 中将对应名字的crate直接下载下来并添加到当前crate的依赖管理中。

Cite

所有下载的cretas会保存在~/.cargo/registry中,防止重复拉取。

稀疏索引

原本的索引会全部拉取到本地,第一次拉取的时候是全量拉取。非常的慢。而稀疏索引则根据我们依赖的项目名称,分析出项目所在的“hash桶”仓库地址,从而拉取更少的索引。

  • 例:serde → https://index.crates.io/se/rd/serde
  • 例:tokio → https://index.crates.io/to/ki/tokio
Cargo.lock文件的作用

cargo.toml的配置并不明确,我们只指定了要用的依赖版本范围。cargo在build的时候会计算具体需要用依赖的哪个版本,并且计算出依赖关系树,以及一些其他信息,保存在cargo.lock文件中。之后的cargo build,run时如果cargo.toml没变则会直接使用cargo.lock文件中的具体数值,而不会重新计算版本导致每次build依赖版本都不一样。
cargo update能强行升级所有依赖。

所以当我们的cargo项目是二进制项目,我们需要确切的版本号,请将cargo.lock加入版本管理。
当我们的项目是lib项目,我们应该保持项目依赖的范围,这样别的程序将我们的库作为依赖,就可以计算更适合他的依赖版本,而不是被我们的精确的依赖限定死他项目的依赖。所以此时不要将cargo.lock加入版本管理。

cargo 编译10GB 缓存

这并不是一个 bug。它更像是为了编译速度和运行时性能而做出的一个权衡,Cargo 把所有认为有用的信息都缓存下来了

可以选择不同粒度的清理方案

全量清理 (cargo clean)
智能清理 (cargo sweep)
以及一些特定场景的操作…

如何减小target?

减少重复编译:在项目根目录的 .cargo/config.toml 文件中增加 [build] 配置,指向一个绝对的公共路径,这样所有项目共享同一个编译缓存,避免同一份依赖被反复编译
限制历史版本:在你的全局 Cargo 配置(~/.cargo/config.toml)中,可以设置保留的 registry 的版本数量。
链接而非复制:在 Windows 上,设置 [unstable] 下的 link-lib-rs 选项,可以让多个 crate 共享相同的系统库,而不是各自复制一份。

VS Code 插件

  1. rust-analyzer 作为 Rust 语言的插件
    1. Even Better TOML,支持 .toml 文件完整特性
  2. Error Lens, 更好的获得错误展示
  3. One Dark Pro, 非常好看的 VSCode 主题
  4. CodeLLDB, Debugger 程序

下一节 1 Rust变量与类型