Rust Toolchain
| 工具链/版本管理器 | Rust 编译器 | 代码格式化工具 | 代码检查工具 | 包管理器 | 包注册中心 |
|---|---|---|---|---|---|
rustup | rustc | rustfmt | clippy | cargo | crates.io |
一、简单介绍 💡
-
rustup:Rust 工具链的安装和更新工 具。这个工具用于在发布新版本的 Rust 时安装和更新rustc和cargo。此外,rustup还可以下载标准库的文档。你可以同时安装多个版本的 Rust,并使用rustup在它们之间切换。 -
rustc:Rust 编译器,用于将.rs文件转换为二进制文件或其他中间格式。 -
rustfmt:用于根据样式指南格式化 Rust 代码的工具。它确保 Rust 代码的一致性并符合社区标准。 -
clippy:一组用于捕捉常见错误并改进 Rust 代码的 lint 集合。它提供惯用的 Rust 使用建议,并帮助维护代码质量。 -
cargo:Rust 的依赖管理器和构建工具。Cargo 可以下载依赖项(通常托管在 https://crates.io 上),并在构建项目时将这些依赖项传递给rustc。Cargo 还内置了测试运行器,用于执行单元测试。 -
crates.io:Rust 的官方包注册表,开发者可以在这里发布、发现和管理 Rust 库(crates)。它是 Rust 包和依赖项的主要来源。
二、Editions 📚
Rust 版本是一种结构化的方法,用于引入新功能和改进,同时保持向后兼容性。这确保了用旧版本编写的代码仍可以使用较新的编译器进行编译。
Rust 版本每三年发布一次,使得在不破坏现有代码的情况下可以引入重大更改。
到目前为止,Rust 已经发布了三个版本:2015 年、2018 年和 2021 年。每个版本都引入了新的语法、功能和改进。
版本在 Cargo.toml 文件的 [package] 部分指定,指导 Rust 编译器应用哪个版本的规则。
不同版本的代码可以在同一项目中共存,从而实现向较新版本的逐步迁移。
cargo fix 等工具通过自动应用必要的更改,帮助将代码迁移到较新的版本。
版本使 Rust 能够在不干扰现有项目的情况下发展和改进,使开发人员能够更轻松地按照自己的节奏采用新功能。
三、Crate 📦
Rust 通过 crate 系统实现代码模块化和组织。
crate 是 Rust 的基本编译单元,可被编译为可执行二进制文件或库文件。这种结构促进了代码的模块化、可重用性和关注点分离。
crate 系统还支持代码共享,允许开发者在不同项目间复用功能模块,提高开发效率并减少重复工作。通过 crate,Rust 为大型项目的结构化和协作开发提供了强大的支持。
1、二进制 crate 💻
通常以main.rs作为入口点,编译后生成可执行文件。
// src/main.rs
fn main() {
println!("Hello, world!");
}
2、Library Crate 📦
通常以lib.rs为主文件,编译后生成供其他程序使用的库。
// src/lib.rs
pub fn greet(name: &str) -> String {
println!("Hello, {}!", name);
}
这个库可以被其他 crate 引用。
// src/main.rs
use my_library::greet;
fn main() {
let message = greet("Alice");
println!("{}", message);
}
四、Modules 📚
Rust 中的模块,类似 C++ 中的命名空间,Java 语言中的包。
Rust 语言中一个 crate 可以存放多个模块。
我们常说功能模块,就是用于将函数或结构体按照功能分组。也常常把相似的函数或者实现相同功能的或者共同实现一个功能的函数和结构体划分到一个模块中。
1、定义模块 📦
mod module_name {
fn function_name() {
// ……
}
}
Rust 语言中的模块默认是私有的。如果一个模块或者模块内的函数需要导出为外部使用,则需要添加 pub 关键字。私有的模块不能为外部其它模块或程序所调用。私有模块的所有函数都必须是私有的,而公开的模块,则即可以有公开的函数也可以有私有的函数。
pub mod public_module {
pub fn public_function() {
// ……
}
fn private_function() {
// ……
}
}
mod private_module {
fn private_function() {
// ……
}
}
2、调用模块 📞
use 公开的模块名::函数名;
创建类库:
cargo new –lib mylib
// src/lib.rs
/// Adds two numbers and returns the result.
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
/// Multiplies two numbers and returns the result.
pub fn multiply(a: i32, b: i32) -> i32 {
a * b
}
进入 mylib 目录执行 cargo build
打开根目录 Cargo.toml
[dependencies]
mylib = { path = "..//mylib" }
// src/main.rs
use mylib::{add, multiply};
fn main() {
let sum = add(5, 10);
let product = multiply(5, 10);
println!("Sum: {}", sum);
println!("Product: {}", product);
}
Rust 允许一个模块中嵌套另一个模块,换种说法,就是允许多层级模块。调用或使用嵌套模块的方法使用两个冒号 (::) 从左到右拼接从外到内的模块即可。
use mod1::mod2::mod3::方法名;
fn main() {
方法名();
}
3、路径 🛤
绝对路径:从 crate root 开始,使用 crate 名或字面值 crate;
相对路径:从当前模块开始,使用 self 、super 或当前模块的标识符;
如果定义的部分和使用的部分总是一起移动,用相对路径,可以独立拆解出来,用绝对路径。
my_crate
├── src
│ ├── lib.rs
│ └── utils.rs
// src/utils.rs
pub fn greet() {
println!("Hello!");
}
// src/lib.rs
pub mod utils;
fn main() {
my_crate::utils::greet();
crate::utils::greet();
}
my_crate
├── src
│ ├── lib.rs
│ └── module_a.rs
│ └── module_b.rs
// src/module_a.rs
pub fn function_a() {
println!("Function A");
self::function_b();
}
pub fn function_b() {
println!("Function B");
}
// src/module_b.rs
pub fn call_function_a() {
super::module_a::function_a();
}
// src/lib.rs
pub mod module_a;
pub mod module_b;
fn main() {
module_b::call_function_a();
}
五、Cargo 🚢
Cargo 是 Rust 的包管理器和构建系统,它简化了管理依赖项、编译包和分发软件等许多任务。这个生态系统使开发人员能够轻松共享库、简化构建过程并轻松管理多个项目。
此外,Rust 的编译器因其有用的错误消息而闻名,不仅告诉你出了什么问题,还建议如何修复。
Cargo 通过管理项目创建、构建和依赖项管理来简化 Rust 开发工作流程。
1、Command ⌨️
`cargo new` 命令使用默认目录结构初始化一个新的 Rust 项目。
添加依赖项很简单;您修改 `Cargo.toml` 文件,`Cargo` 会处理获取和编译必要的 `crate`。
`cargo build` 命令编译项目,`cargo run` 编译并运行项目。这种无缝集成使 Rust 开发更加高效和有组织。
`Cargo` 还支持使用 `cargo test` 运行测试,使用 `cargo doc` 生成文档,以及使用`cargo publish` 将库发布到 `crates.io`。其全面的功能集和易用性使其成为 Rust 生态系统中的重要工具。
`cargo --list` 此命令列出所有可用的 `cargo` 子命令及其简要说明,帮助开发者快速了解 `cargo` 提供的功能和选项,以便更高效地管理 Rust 项目。
使用 `cargo check` 快速检查项目是否有错误,使用 `cargo build` 无需运行即可编译。你可以在 `target/debug/` 中找到正常调试编译的输出结果。使用 `cargo build --release` 可以在 `target/release/` 中生成经过优化的发布版本。
`--verbose` 是一个常见的命令行参数,用于让程序输出更多的运行时信息,以便于更好地了解程序的运行状态和更详尽地进行调试。更具体的含义和行为可能会依据具体的程序而有所差异。
| 命令 | 说明 |
|---|---|
cargo new | 在当前目录下新建一个项目 |
cargo check | 分析当前项目并报告项目中的错误,但不会编译任何项目文件 |
cargo build | 编译当前项目,生成可执行文件或库,输出到 target 目录 |
cargo run |