Rust 基础语法指南
1. Rust 环境搭建
1.1 安装 Rust 工具链
Rust 的安装过程非常简单,主要通过 rustup
工具来完成。rustup
是 Rust 官方推荐的工具链管理器,它可以帮助我们轻松地安装、更新和切换不同版本的 Rust 编译器和相关工具。
首先,我们需要打开终端或命令行界面,执行官方提供的安装脚本来安装 rustup
:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
这个命令会下载并运行 Rust 安装脚本,该脚本会自动检测您的操作系统,并安装相应的 rustup
工具。安装过程中会提示您确认安装,只需按照提示操作即可。
安装完成后,rustup
会成为我们管理 Rust 环境的主要工具。它提供了许多有用的命令来管理 Rust 版本:
rustup update
命令用于更新 Rust 到最新稳定版本rustup toolchain list
显示已安装的所有工具链rustup default stable
设置默认使用的工具链版本
除了基本的编译器外,rustup
还会自动安装以下重要组件:
rustc
:Rust 编译器,负责将 Rust 代码编译成可执行文件cargo
:Rust 的包管理器和构建工具,是日常开发中最重要的工具之一rustfmt
:代码格式化工具,确保代码风格统一clippy
:代码检查工具,帮助发现潜在的问题和改进点
1.2 配置开发环境
安装完 Rust 后,我们需要验证安装是否成功并配置好开发环境。首先,我们可以检查 Rust 编译器的版本:
rustc --version
该命令会显示当前安装的 Rust 版本号,例如 rustc 1.70.0 (90c541806 2023-05-31)
。
同样,我们也应该检查 cargo
的版本:
cargo --version
为了获得更好的开发体验,强烈建议配置 IDE 插件支持。对于 Visual Studio Code 用户,推荐安装 rust-analyzer
扩展,它提供了强大的代码补全、语法高亮、错误检查等功能。其他编辑器如 IntelliJ IDEA 也有相应的 Rust 插件支持。
环境变量配置通常会在安装过程中自动完成,但有时可能需要手动配置。确保 ~/.cargo/bin
目录已经添加到系统的 PATH 环境变量中,这样就可以在任何位置使用 cargo
和 rustc
命令了。
1.3 创建第一个 Rust 项目
Rust 生态系统中,cargo
是核心的构建和包管理工具。它不仅能够管理项目的依赖关系,还能处理项目的构建、测试、文档生成等任务。
使用 cargo
创建新项目非常简单,只需要执行以下命令:
cargo new hello_world
这个命令会创建一个名为 hello_world
的新目录,其中包含完整的项目结构:
Cargo.toml
:这是项目的配置文件,定义了项目的基本信息、依赖关系等src/
:源代码目录main.rs
:主程序文件,程序的入口点就在这里
Cargo.toml
文件采用 TOML 格式,包含了项目的基本配置信息:
[package]
name = "hello_world"
version = "0.1.0"
edition = "2021"[dependencies]
默认情况下,新建的项目是一个二进制可执行项目。如果我们想要创建一个库项目,可以使用 --lib
参数:
cargo new --lib my_library
创建项目后,我们可以使用多种 cargo
命令来管理和构建项目:
cargo run
:编译并运行项目,是最常用的命令之一cargo build
:只编译项目,生成可执行文件位于target/debug/
目录下cargo build --release
:编译优化后的发布版本,位于target/release/
目录下cargo check
:快速检查代码是否有语法错误,比完整编译更快cargo test
:运行项目中的单元测试
2. 基本语法概念
2.1 变量与可变性
Rust 的变量系统具有独特的特点,其中最显著的是变量默认不可变性和所有权系统。这种设计有助于在编译期防止数据竞争和其他常见错误。
在 Rust 中,我们使用 let
关键字来声明变量:
let x = 5;
这个声明创建了一个名为 x
的不可变变量,并将其初始化为值 5
。一旦声明后,就不能修改 x
的值。尝试修改不可变变量会导致编译错误:
let x = 5;
// x = 6; // 这会导致编译错误
如果确实需要修改变量的值,我们必须显式地使用 mut
关键字来声明变量为可变:
let mut y = 10;
y = 15; // 合法,因为 y 是可变的
这种设计鼓励开发者写出更安全的代码,因为它强制我们在声明变量时思考是否真的需要修改它的值。
除了普通变量,Rust 还支持常量声明,使用 const
关键字:
const MAX_POINTS: u32 = 100_000;
常量有几个重要的特点:
- 必须在声明时指定类型
- 只能在编译时常量表达式中使用
- 在整个程序中都是全局有效的
- 命名约定通常使用全大写字母和下划线
2.2 数据类型系统
Rust 拥有丰富的类型系统,包括标量类型和复合类型两大类。
标量类型是最基本的数据类型,包括:
- 整数类型:
i8
,i16
,i32
,i64
,i128
,isize
(有符号)和u8
,u16
,u32
,u64
,u128
,usize
(无符号) - 浮点类型:
f32
和f64
- 布尔类型:
bool
- 字符类型:
char
let integer: i32 = 42; // 32位有符号整数
let float: f64 = 3.14; // 64位浮点数
let boolean: bool = true; // 布尔值
let character: char = '🦀'; // Unicode字符
复合类型包括元组和数组:
- 元组可以包含不同类型的数据,长度固定
- 数组包含相同类型的元素,长度也固定
let tuple: (i32, f64, char) = (42, 3.14, 'A');
let array: [i32; 5] = [1, 2, 3, 4, 5];
Rust 还具有强大的类型推断能力,大多数情况下不需要显式指定类型,编译器可以根据上下文推断出正确的类型。
2.3 函数定义与调用
函数是 Rust 程序的基本组成单元。使用 fn
关键字定义函数,函数名称遵循 snake_case 命名约定。
最基本的函数定义形式如下:
fn main() {println!("Hello, world!");another_function(5, 6);
}fn another_function(x: i32, y: i32) {println!("The value of x is: {}", x);println!("The value of y is: {}", y);
}
函数参数必须声明类型,这有助于提高代码的清晰度和安全性。函数体由一系列语句和表达式组成,最后一行表达式的值会自动作为函数的返回值(如果没有显式使用 return
关键字)。
函数也可以有返回值,使用箭头语法指定返回类型:
fn five() -> i32 {5
}
2.4 注释语法规范
Rust 提供了多种注释方式来帮助开发者编写清晰的代码文档。
行注释使用双斜杠 [//](file://D:\workspace\demo\1.txt),从当前位置到行末的所有内容都会被视为注释:
// 这是行注释
let x = 5; // 行注释也可以放在代码后面
块注释使用 /* */
形式,可以跨越多行:
/*这是块注释可以跨越多行
*/
文档注释是 Rust 特有的功能,使用三斜杠 [///](file://D:\workspace\demo\1.txt) 或三斜杠块注释 / ** /
,专门用于为函数、结构体等生成文档:
/// 这是文档注释,用于函数文档
/// 它会被包含在生成的文档中
fn example_function() {//! 这是内部文档注释,用于模块或crate文档
}
3. 所有权系统
3.1 所有权概念
所有权系统是 Rust 最独特和最重要的特性之一,它在不使用垃圾回收的情