探索 Rust 编程语言:特性、优势及学习资源
您是否正在考虑学习 Rust 这门编程语言?本文旨在帮助您做出决定,深入探讨 Rust 的核心特性,这是一种广受欢迎的系统编程语言。
我们将详细分析 Rust 的特点,包括其类型系统、内存安全机制以及所有权模型。此外,我们还会为您提供一份精选的学习资源清单,助力您的 Rust 学习之旅。
让我们开始吧!
什么是 Rust?
Rust 是一种现代系统编程语言,最初由 Graydon Hoare 在 2006 年作为个人项目启动。在短短十年内,它已迅速崛起,成为系统编程和相关应用的首选语言。值得一提的是,Rust 开发人员的平均薪资约为每年 12 万美元。
如果您正考虑从 C++ 转向 Rust,或希望掌握一门新的编程语言,那么 Rust 将是一个绝佳选择!根据 Stack Overflow 的开发者调查,Rust 已连续七年荣获“最受欢迎编程语言”称号。
图片来源:Stack Overflow
Rust 兼具底层系统编程语言(如 C 和 C++)的速度优势,以及高级编程语言(如 Python)的安全性特点。
从 Dropbox 和 Firefox 等知名项目到 WebAssembly 和嵌入式编程,Rust 在软件开发的各个领域都有着广泛的应用。 Rust 还通过 Cargo 提供了一套开箱即用的包管理系统。
Cargo:Rust 的包管理器
Cargo 是 Rust 生态系统中至关重要的包管理工具。您可以利用 Cargo 从 crates.io(Rust 的软件包注册中心)便捷地安装各种软件包。除了管理软件包的搜索、安装和更新,Cargo 还兼具测试运行器、文档生成器和构建系统的功能。
现在,您已经对 Rust 有了一个基本的了解。接下来,让我们深入剖析 Rust 的一些关键特性,这些特性使其在众多系统编程语言中脱颖而出。
清晰的错误信息
作为初学者,您在学习编程过程中难免会遇到各种错误,并花费大量时间进行调试。Rust 的编译器提供的错误信息和警告,将成为您解决问题的得力助手。这些清晰的提示可以帮助您更高效地进行代码调试。
示例错误消息
当您的代码编译失败时,Rust 会提供详细的错误信息,明确指出代码中需要修改的内容和位置。
以下示例中,变量 num2
在函数 inner()
内部定义,其作用域仅限于该函数内部。如果您尝试在函数外部访问它,编译器会报错:
fn main() { let num1 = 10; fn inner(){ let num2 = 9; } println!("The value of num2 is: {}", num2); }
错误信息会清晰地指出问题所在:
error[E0425]: cannot find value `num2` in this scope --> src/main.rs:6:42 | 6 | println!("The value of num2 is: {}", num2); | ^^^^ help: a local variable with a similar name exists: `num1`
编译期间的警告
编译器还会针对代码中潜在的问题发出警告。例如,如果您声明了一个变量,但从未在程序的其他部分使用它,Rust 编译器会发出警告信息:
fn main() { let num1 = 10; let num2 = 9; println!("The value of num1 is: {}", num1); }
在此示例中,变量 num2
已声明但未使用:
warning: unused variable: `num2` --> src/main.rs:3:9 | 3 | let num2 = 9; | ^^^^ help: if this is intentional, prefix it with an underscore: `_num2` |
强类型语言
Rust 强大的类型系统是其另一个吸引开发人员的特性。 Rust 是一种强类型语言,这意味着它不支持隐式类型转换。隐式类型转换是指编程语言自动将一种数据类型的值转换为另一种数据类型。
例如,以下 Python 代码可以正常运行,不会报错。这是因为在 Python 中,非零数字的布尔值为 True,因此 if 语句会正常执行,尽管数字 10 是整数而不是布尔值:
num1 = 10 if num1: num2 = 9 print(f"num2 is {num2}") # Output: num2 is 9
另一方面,Rust 不会自动进行类型转换。以下 Rust 代码会报错:
fn main() { let num1 = 10; if num1{ let num2 = 9; } }
错误信息指出类型不匹配,if
语句需要布尔类型,但却接收到了整数类型。
error[E0308]: mismatched types --> src/main.rs:3:8 | 3 | if num1{ | ^^^^ expected `bool`, found integer
内存安全
内存安全是 Rust 吸引程序员的另一大特点。下面我们将对其工作原理进行简要概述。
变量必须先初始化
在 Rust 中,所有变量都必须在使用前进行初始化。在 C 语言等语言中,以下代码中未初始化的 num
变量可以编译并运行,不会报错,尽管其值是不确定的垃圾值。
#include <stdio.h> int main(void) { int num; printf("The value of num is %d", num); return 0; } // Output: The value of num is 0
如果您尝试在 Rust 中执行类似的操作,您将会遇到编译时错误。因此,Rust 没有垃圾回收机制。
fn main() { let num:i32; println!("The value of num is: {}",num); }
error[E0381]: used binding `num` isn't initialized --> src/main.rs:3:40 | 2 | let num:i32; | --- binding declared here but left uninitialized 3 | println!("The value of num is: {}",num); | ^^^ `num` used here but it isn't initialized |
编译时的内存安全
Rust 在编译时确保内存安全。考虑一个简单的示例。即使 if
条件语句的布尔值为 true,这意味着 num
的值将始终为 100,但当我们尝试打印 num
的值时,我们依然会遇到错误:
fn main() { let num:i32; if true{ num = 100; } println!("The value of num is: {}", num); }
这是因为条件求值发生在运行时,编译器无法在编译时保证 num
具有值。
error[E0381]: used binding `num` is possibly-uninitialized --> src/main.rs:6:41 | 2 | let num:i32; | --- binding declared here but left uninitialized 3 | if true{ | ---- if this `if` condition is `false`, `num` is not initialized 4 | num = 100; 5 | } | - an `else` arm might be missing here, initializing `num` 6 | println!("The value of num is: {}", num); | ^^^ `num` used here but it is possibly-uninitialized
仔细查看错误信息,您会发现通过添加 else
语句,我们可以确保 num
具有值。因此,以下代码可以正常运行。因为这样,编译器可以确定 num
在编译时会有一个值,所以不会报错:
fn main() { let num:i32; if true{ num = 100; } else{ num = 50; } println!("The value of num is: {}", num); }
The value of num is: 100
变量的不可变性
值得注意的是,Rust 中的变量默认是不可变的。这意味着作为开发人员,您无需担心意外覆盖特定变量的值。这是一个示例:
fn main() { let num1 = 10; num1 = 5; println!("The value of num1 is: {}", num1); }
由于 num1
初始化为 10,当您尝试为其赋值 5 时,您会收到一条错误消息,指出“无法为不可变变量 num1
赋值两次”。
error[E0384]: cannot assign twice to immutable variable `num1` --> src/main.rs:3:5 | 2 | let num1 = 10; | ---- | | | first assignment to `num1` | help: consider making this binding mutable: `mut num1` 3 | num1 = 5; | ^^^^^^^^ cannot assign twice to immutable variable
所有权和借用
所有权机制是 Rust 实现内存安全的关键。从功能上讲,Rust 中的所有权可以概括为:
每个对象都应该有且只有一个所有者。当所有者超出作用域时,对象将被自动销毁。
举一个简单的例子。我们初始化一个字符串 str1
,然后将其值移动到 str2
。由于任何对象只能有一个所有者,一旦将 str1
对象的值移动到 str2
,str1
对象就会被销毁。
fn main() { let str1 = String::from("Rust"); let str2 = str1; println!("The value of str1 is: {}", str1); }
error[E0382]: borrow of moved value: `str1` --> src/main.rs:4:42 | 2 | let str1 = String::from("Rust"); | ---- move occurs because `str1` has type `String`, which does not implement the `Copy` trait 3 | let str2 = str1; | ---- value moved here 4 | println!("The value of str1 is: {}", str1); | ^^^^ value borrowed here after move
虽然这看起来很直观,但为了更好地理解所有权的运作方式,掌握借用和引用的概念会很有帮助。
快速开发
到目前为止,我们已经讨论了 Rust 编程语言的几个有益特性。总结一下:
- Rust 在设计时就考虑到了速度和安全性。
- 它内置了包管理工具和构建系统。
- 它还拥有丰富的标准库。
总而言之,Rust 几乎满足了开发人员的所有需求。因此,使用 Rust,您可以快速开发应用程序,并减少调试和构建时间。
跨平台开发
使用 Rust,您可以自由选择在您偏好的平台上进行开发。Rust 支持最常见的平台:Linux、MacOS 和 Windows。
应用程序开发通常非常简单,因为您可以将 Rust 源代码编译为可执行文件,而无需依赖额外的构建工具和外部编译器。
活跃的社区
一个支持性的社区对于简化您的学习过程至关重要。Rust 拥有庞大的用户群体,并且还在不断增长。
Rust 在 Stack Overflow 开发者调查中的受欢迎程度表明,存在一个庞大的用户社区,其中许多经验丰富的开发人员都乐于分享他们的知识和专业技能。
除了官方文档之外,还有一个用户维护的文档站点和一个讨论论坛。您还可以查看 Rust subreddit 和 LinkedIn 小组以进行相关讨论。
开始使用 Rust 的学习资源
本节列出了一些有助于您开始学习 Rust 的有用资源。 这并非详尽的列表,但包括一些建议的教程、课程和书籍,以帮助您踏上学习之旅。
#1。 Rust By Example
Rust By Example 通过一系列示例教授您 Rust 的基础知识和标准库,您可以在在线编辑器中运行这些示例。
涵盖的主题包括 crates、Cargo(Rust 的包管理工具)、泛型、特征、错误处理等等。
#2。 Rustlings
Rustlings 是另一个 Rust 编程语言的官方学习资源。它与 Rust By Example 类似,但它要求您设置本地开发环境、克隆示例存储库并解决简单的问题,以便学习这些概念。
#3。 Exercism Rust Track
Exercism 上的 Rust 课程提供了 100 多个练习,可帮助您学习和测试您对 Rust 的理解。 Exercism 是一个免费平台,除了通过练习编写代码之外,您还可以获得经验丰富的程序员的指导。
#4。 Ultimate Rust 速成班
Nathan Stocks 在 Udemy 上教授的 Ultimate Rust 速成课程涵盖以下主题:
- Rust 编程基础
- Rust 中的模块系统
- 数据类型和控制流
- 引用和借用
- 结构体、特征和集合
#5。 Ultimate Rust 2:中级概念
Ultimate Rust 2 是 Ultimate Rust 速成班的进阶课程,涵盖以下主题:
- 闭包
- 迭代器
- 错误处理
- 单元测试和集成测试
- 日志记录、多线程和通道
#6。 Rust lang:完整的初学者指南 2023
这门由 Catalin Stefan 教授的 Udemy 课程是 Rust 编程的综合课程。涵盖的主题包括:
- Rust 基础知识
- 数据类型、控制结构
- 函数、特征
- 内存管理
- 并发
#7。 Programming Rust:快速、安全的系统开发
由 O’Reilly 出版的《Programming Rust》是一本广受欢迎的 Rust 编程书籍,它将教您以下内容:
- 基本数据类型
- 所有权和借用
- 异步编程
- 快速多线程应用程序
- 闭包、迭代器
- 集合
#8。 Rust 编程语言,第 2 版
《Rust 编程语言》由 Rust 社区的知名贡献者编写。本书涵盖了您需要了解的关于 Rust 的所有内容,包括:
- 所有权和借用
- 泛型、特征
- 智能指针、多线程
- 测试和错误处理
#9。 完整的 Rust 编程参考指南
Packt 出版的《完整的 Rust 编程参考指南》涵盖以下主题:
- 在 Rust 中实现数据结构
- 用 Rust 编写可重用和可测试的组件
- 设计多线程应用程序的算法设计
- Rust 在 WebAssembly、网络和命令行应用程序中的应用
#10。 Rust 程序员的创意项目
如果您是一位经验丰富的开发人员,希望通过实践来掌握 Rust,那么构建您感兴趣领域的项目将是不错的选择。Packt 出版的《Rust 程序员的创意项目》这本书通过将 Rust 应用于以下项目来教授 Rust:
- 构建 Restful Web 服务
- 2D 游戏
- 使用 WebAssembly 开发 Web 应用程序
- 机器语言模拟器
- 等等!
结论
本文概述了 Rust 作为一种系统编程语言的特点,包括内存安全和改进的包管理等特性。我们还列出了一些学习资源,以帮助您开始使用 Rust。
接下来,您可以选择一个或多个推荐的学习资源来学习 Rust 的基础知识。祝您 Rust 编程愉快!
您还可以探索一些最佳的 Rust 服务器托管提供商。