欢迎来到Rust世界 | Welcome to the World of Rust
第 1 章:欢迎来到Rust世界 | Welcome to the World of Rust
为什么要学Rust?
编程世界的新挑战
想象一下,你正在搭建一座乐高积木城堡。你希望这座城堡既高大又稳固,能够抵御"程序世界"里的小怪兽攻击。在编程的世界里,这些小怪兽有一个名字——Bug。Bug是那些偷偷溜进代码里,让程序崩溃或做出奇怪行为的坏家伙。
传统编程语言就像是用手搭积木:你可以搭建出漂亮的城堡,但总有些地方不够牢固。一个不小心,城堡就会倒塌。更糟糕的是,有些问题在你搭建的时候根本看不出来,要等到城堡搭好、住进了人(程序运行起来)之后才发现。那时候,要找到问题出在哪里、再重新修复,可就麻烦了。
Rust编程语言的出现,就是为了解决这个问题。它像是一位超级聪明的建筑大师,不仅能帮你搭建城堡,还能一边搭一边检查每一块积木是否牢固。如果某块积木放得不对,Rust会立刻告诉你,并告诉你应该怎么改正。这样,你就能在搭建的过程中就把问题解决,而不是等到城堡塌了才手忙脚乱。
这就是Rust最厉害的地方——它能让你的程序天生就更安全,不需要你成为安全专家,也能写出很少出错的代码。对于刚开始学习编程的小朋友来说,这简直就像拥有了一位永远不会累、永远耐心的编程老师!
Rust是谁发明的?
Rust是一门相对"年轻"的编程语言,它诞生于2010年,由Mozilla公司(就是那个做Firefox浏览器的公司)的一群天才程序员创造。他们有一个共同的梦想:创造一门既有C语言那样高性能,又像Python那样安全的编程语言。
经过十几年的发展和完善,Rust已经变得非常成熟和强大。它被用在了很多重要的地方:比如Firefox浏览器的核心部分、Windows操作系统的某些组件、甚至连Linux内核也开始采用Rust来编写一些关键代码。2021年,Rust连续第七年被Stack Overflow开发者调查评为"最受欢迎的编程语言"。这意味着,在全球数百万程序员的心中,Rust是大家最想学习的语言!
现在,你即将成为这个大家庭的一员。让我们一起开始这段神奇的学习之旅吧!
Rust是什么?
一门强调安全、并发与性能的语言
如果我们把Rust比作一位超级英雄,那它的超能力可以概括为三个词:安全(Safety)、并发(Concurrency)、性能(Performance)。
安全,听起来很简单,但在程序世界里,安全意味着你的代码不会做出"危险"的事情。比如,你的程序不会突然崩溃,不会访问不该访问的内存,不会泄漏你的秘密信息。Rust通过一种叫做"所有权系统"(Ownership System)的魔法,确保你在编写代码的时候就不太可能犯这些错误。
并发,意思是"同时做很多事情"。想象一下,你在玩一个需要同时听音乐、显示画面、响应按钮的游戏。如果程序只能一件事做完再做另一件,那音乐可能会卡顿,画面可能会延迟。Rust让编写能够"同时做多件事"的安全程序变得简单——而且不会有那种多个任务同时访问同一块数据造成的混乱和错误。
性能,指的是程序运行得有多快、多省资源。Rust的运行速度可以和C、C++这样的"老牌快手"相媲美,但它比那些语言更安全。Rust没有"垃圾回收器"(一种在后台自动清理不再使用的内存的系统),这意味着你的程序不需要停下来"打扫卫生",可以一直全速运行。
Rust编译器:严格的老师
当你用Rust写代码时,有一个非常重要的角色——编译器(Compiler)。编译器就像一位严格的老师,它会仔细阅读你写的每一行代码,检查是否有问题。
在其他一些编程语言中,编译器可能只是简单地把你的代码翻译成计算机能理解的形式,不太管你写得好不好、对不对。但Rust的编译器可不是这样!它会严格地检查你的代码,如果发现任何可能造成问题的错误,它会告诉你:
```rust error[E0382]: borrow of moved value: `message` --> src/main.rs:6:5 | 5 | let message = String::from("Hello, Rust!"); | -------- move occurs because `message` has type `String`, | which does not implement the `Copy` trait 6 | println!("{}", message); | ^^^^^^^ value borrowed here after move | = note: move occurs because `message` has type `String`, which does not implement the `Copy` trait | value moved into `greet()` here ```
这个错误信息看起来很复杂,但别担心!在Rust的帮助下,你会慢慢学会如何理解和解决这些问题。编译器给出的错误信息非常详细,甚至会告诉你问题出在哪一行、可能的原因是什么、建议怎么修改。
刚开始,你可能会觉得这位"老师"太严格了——为什么我明明知道代码能工作,却不让我运行?但很快你就会发现,这位严格的老师其实是在帮你一个大忙:它在你真正运行程序之前就帮你找到了问题。在实际的项目中,如果这些问题没有被提前发现,可能会导致程序崩溃、数据丢失,甚至被黑客利用造成更大的损失。
Rust的哲学:编译时解决,不要等到运行时
Rust有一个非常重要的设计哲学:如果一个错误可以在编译时被检测出来,那就绝不要留到运行时。
这句话的意思是:如果你的代码有问题,Rust会尽量在"编译"阶段(把代码变成可执行程序的时候)就告诉你,而不是等到你运行程序的时候才发现。这意味着:
1. 更少的崩溃:你的程序在实际使用中崩溃的概率大大降低。 2. 更安全:很多可能导致安全漏洞的问题都能在早期发现。 3. 更可靠:你的程序行为更容易预测和理解。
对于学习编程的小朋友来说,这意味着你可以更自信地编写代码——你知道一旦程序成功编译,它大概率会按照你的想法运行。当然,这并不意味着你不会犯错,但Rust确实让整个编程过程变得更加愉快和安心。
Rust的核心优势
内存安全的守护者
要理解Rust为什么如此特别,我们需要先了解一个概念:内存安全。
计算机程序在运行的时候,会使用一块叫做"内存"的临时存储空间。你可以把它想象成一个巨大的停车场,每个程序都在这里停放自己的"数据车辆"。正常情况下,每辆车都停在正确的位置,需要的时候能顺利开出来。
但如果管理不好,就会出问题:
- **空指针引用**:你拿着一张写着"停车场入口"的纸条去停车,结果入口已经被拆除了,车根本不知道停哪里。
- **缓冲区溢出**:你买了一张能停5辆车的票,结果放了6辆车进去,多出来的车会撞到其他停车场的车!
- **数据竞争**:两个人同时想用同一个停车位,谁也不让谁,最后停车场乱成一团。
这些问题在其他编程语言中可能导致程序崩溃、出现奇怪的错误,甚至被恶意利用造成安全漏洞。但在Rust中,得益于所有权系统和借用检查器(Borrow Checker),这些问题几乎不可能发生。
Rust的编译器会在你写代码的时候就检查所有这些潜在问题。如果你试图做一件危险的事情,编译器会直接拒绝编译,并告诉你哪里有问题以及怎么修正。这就像是在你出门之前,帮你检查所有安全带是否系好,而不是等到出了事故才发现问题。
并发编程的得力助手
"并发"听起来很高深,但其实概念很简单:让程序同时做多件事。就像你可以一边听音乐一边浏览网页一样,程序也可以同时处理多个任务。
然而,传统的并发编程有一个巨大的陷阱:数据竞争。当两个任务同时想要修改同一个数据时,如果没有正确的协调,结果可能完全不可预测——就像两个人同时往同一个账户里存钱,可能最后余额算错了!
在很多编程语言中,防止数据竞争需要程序员非常小心,要使用锁、信号量等复杂的同步机制。一旦漏掉某个地方,或者用错了,程序就会出问题。
Rust的设计让数据竞争在编译时就是不可能的!它通过类型系统和所有权规则,确保你只能以安全的方式共享数据。如果你的并发代码有问题,Rust编译器会直接告诉你:"这个操作不安全,请修改!"
这对于学习者来说简直是福音:你不需要成为并发编程的专家,也能写出能安全地同时执行多个任务的程序。
零成本抽象:快且易读
"抽象"是编程中一个重要的概念。简单来说,抽象就是用简单的概念来隐藏复杂的细节,让代码更容易理解和编写。
很多编程语言都提供了抽象工具,但这些抽象往往是有代价的——使用起来简单,但程序会变慢。Rust的"零成本抽象"(Zero-Cost Abstractions)理念意味着:如果你不使用某个功能,你就不会为它付出代价;如果你使用了某个抽象,它生成的代码和你手写的底层代码一样高效。
比如说,在Rust中你可以写一个高级的"迭代器链",看起来非常简洁优雅:
```rust let numbers = vec![1, 2, 3, 4, 5];
// 找出所有偶数,乘以2,然后求和 let result: i32 = numbers .iter() .filter(|&&x| x % 2 == 0) .map(|x| x * 2) .sum(); ```
这段代码看起来很简洁、很高雅,它背后的实现同样高效——Rust编译器会把它优化成和手写的底层循环一样快的机器码。这让你既能写出优雅易读的代码,又能享受极致运行的性能。
活跃的社区生态
学习一门编程语言,不仅仅是学习语言本身,还需要了解围绕它的工具、库和社区。Rust拥有一个极其活跃和友好的社区:
- **Crates.io**:Rust的"包仓库",里面有成千上万个免费开源的代码库,你可以直接拿来使用。比如,你想处理JSON数据?有一个叫`serde_json`的库可以用。想做网页开发?`actix-web`和`axum`都是很好的选择。
- **The Rust Programming Language Book**(官方教程):这是一本免费在线书籍,由Rust团队编写,质量极高,几乎是学习Rust的最佳起点。我们这本书也会在很多地方引用它的内容。
- **Rustlings**:一个互动式的Rust练习工具,通过一个个小练习帮助你熟悉Rust的语法和概念。
- **Rust Playground**:一个在线代码运行器,你可以在浏览器里直接写Rust代码并运行,无需安装任何东西。
- **Rust Community Discord**:一个活跃的社区聊天平台,无论你有什么问题,都有人热情地帮助你。
Rust社区有一个著名的行为准则:所有人都是平等的,每个人都值得被尊重。如果你在学习过程中遇到困难,在社区提问,一定会得到友善和耐心的回答。
Rust开发环境:你的冒险装备
认识Rust工具链三剑客
在我们开始编程之前,需要先搭建好开发环境。就像去冒险需要带上装备一样,写Rust程序需要准备好工具。
Rust的开发环境主要由三个部分组成:
```mermaid flowchart LR A[rustup<br/>工具链管理器] --> B[rustc<br/>编译器] A --> C[cargo<br/>构建系统] B --> D[可执行程序<br/>在电脑上运行] C --> D ```
rustup 是Rust的"瑞士军刀"。它的作用是管理Rust工具链——安装、升级、切换不同版本。想象一下,rustup就像是你游戏中的"装备管理器",它帮你管理所有和Rust相关的工具。
rustc 是Rust的编译器(compiler)。当你写完代码后,rustc负责把人类能看懂的代码翻译成计算机能理解的指令。这个翻译过程叫做"编译"。如果你的代码有问题,rustc会告诉你哪里错了。
cargo 是Rust的"项目管家"和"包管理器"。当你创建新项目、管理依赖、运行程序、测试代码时,几乎所有事情都可以通过cargo来完成。cargo这个名字很有趣——它原意是"货物"或"载重",在编程中代表项目所需的外部代码库。
安装Rust:一步步来
现在,让我们开始安装Rust吧!整个过程大概需要5-10分钟。
在Windows系统上安装
第一步:下载安装程序
打开你的浏览器,访问 Rust 官方网站:
``` https://www.rust-lang.org/zh-CN/tools/install ```
点击"下载Rust"按钮,会下载一个叫做`rustup-init.exe`的文件。
第二步:运行安装程序
双击下载的文件,会打开一个黑色的命令行窗口。你会看到一些选项:
``` Rust Visual C++ build tools required. Download and install the Visual Studio C++ Build Tools? [Y/n] ```
输入 `Y` 并按回车,Rust安装程序会自动下载并安装需要的工具。
第三步:完成安装
安装完成后,你会看到一些确认信息。现在,让我们验证一下是否安装成功!
打开一个新的命令行窗口(按 `Win + R`,输入 `cmd`,回车),输入以下命令:
```bash rustc --version cargo --version ```
如果看到类似这样的输出,说明安装成功了:
``` rustc 1.75.0 (1a1d6e2 2024-01-04) cargo 1.75.0 (1a1d6e2 2024-01-04) ```
恭喜你!你的电脑现在可以运行Rust程序了!
在macOS或Linux系统上安装
打开你的终端(Terminal),输入以下命令:
```bash curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh ```
这个命令会下载并运行Rust安装脚本。按照屏幕上的提示操作就可以了。通常情况下,选择默认选项(输入1)就足够了。
安装完成后,同样可以使用以下命令验证:
```bash rustc --version cargo --version ```
使用Rust Playground(在线体验)
如果你暂时不想在电脑上安装Rust,或者想在任何设备上快速尝试Rust代码,可以使用Rust Playground:
``` https://play.rust-lang.org/ ```
这是一个在线工具,你可以在网页上直接编写、运行Rust代码,非常适合学习和实验!
更新和卸载Rust
更新Rust
Rust会定期发布新版本。要更新到最新版本,只需运行:
```bash rustup update ```
卸载Rust
如果有一天你需要卸载Rust,运行:
```bash rustup self uninstall ```
按照提示操作即可完全移除Rust。
Cargo常用命令一览
cargo是Rust开发中使用最频繁的工具。以下是一些最常用的命令:
| 命令 | 作用 | |------|------| | `cargo new 项目名` | 创建一个新项目 | | `cargo build` | 编译项目 | | `cargo run` | 编译并运行项目 | | `cargo test` | 运行项目中的测试 | | `cargo check` | 快速检查代码是否有错(比build快,但不生成可执行文件) | | `cargo doc` | 为项目生成文档 | | `cargo fmt` | 格式化代码,让代码风格一致 | | `cargo clippy` | 运行额外的代码检查,发现潜在问题 |
我们会在接下来的内容中逐步熟悉这些命令。
第一个Rust程序:Hello World
使用Cargo创建新项目
现在,我们来创建第一个Rust项目!打开你的命令行终端,进入你想要存放项目的文件夹,然后输入:
```bash cargo new hello_world ```
这行命令的意思是:"cargo,请帮我创建一个叫'hello_world'的新项目"。
cargo会为你创建以下文件:
``` hello_world/ ├── Cargo.toml # 项目的配置文件 └── src/ └── main.rs # 你的代码文件 ```
让我看看这些文件里有什么:
src/main.rs 是你的源代码文件,目前它包含:
```rust fn main() { println!("Hello, world!"); } ```
Cargo.toml 是项目的配置文件,看起来像这样:
```toml [package] name = "hello_world" version = "0.1.0" edition = "2021"
[dependencies] ```
现在,先记住这个结构,我们之后会详细解释每个部分的含义。
运行你的第一个程序
在命令行中,进入项目目录:
```bash cd hello_world ```
然后运行:
```bash cargo run ```
你会看到类似这样的输出:
``` Compiling hello_world v0.1.0 (路径/to/你的/hello_world) Finished dev [unoptimized + debuginfo] target(s) in 0.52s Running `target/debug/hello_world` Hello, world! ```
太棒了!你成功运行了你的第一个Rust程序!🎉
解读你的第一个程序
让我们仔细看看这四行代码:
```rust fn main() { println!("Hello, world!"); } ```
`fn main()` — 在Rust中,`fn`是"function"(函数)的缩写。`main`是一个特殊的名字:它代表