本笔记用于自用。现在有一些高级功能未使用,导致现在忘记了。干脆整理了一下几个月前学rust语法时学习内容。本笔记基于rustling练习题中学习的知识。不是0基础的教程。
第一章:基础语法
本章对应《Rust编程语言》第3章内容,涵盖变量、函数、条件控制流和基本数据类型。
1. println! 宏与输出 (入门)
核心知识点
println! 宏:用于向控制台打印文本,是学习Rust的第一个宏。
rust
println!("Hello, world!"); // 基本输出
println!("数字是: {}", 42); // 格式化输出,{}是占位符
println!("x = {}, y = {}", 10, 20); // 多个占位符
原始字符串(Raw String) :使用 r#"..."# 语法,内部的特殊字符不需要转义:
rust
println!(r#"这是原始字符串,不需要转义\n"#);
println!(r#"可以包含"双引号"和\反斜杠"#);
空 println!:打印空行
rust
println!(); // 输出一个空行
2. 变量与可变性 (§3.1)
核心知识点
Rust变量默认是不可变的,这是Rust安全性的基石之一。
rust
let x = 5; // 不可变变量
x = 6; // ❌ 编译错误:不能修改不可变变量
使用 mut 关键字创建可变变量:
rust
let mut x = 5; // 可变变量
x = 6; // ✅ 正确
变量遮蔽(Shadowing):可以用相同变量名重新绑定,甚至改变类型:
rust
let x = 5;
let x = x + 1; // 遮蔽,x = 6
let x = "six"; // 遮蔽,x变成字符串类型
常量 :使用 const 声明,必须标注类型,只能设为常量表达式:
rust
const MAX_POINTS: u32 = 100_000;
3. 函数 (§3.3)
核心知识点
函数定义语法:
rust
fn function_name(param1: Type1, param2: Type2) -> ReturnType {
// 函数体
// 最后一个表达式作为返回值(无需return)
}
关键规则:
- 参数必须标注类型
- 返回值类型在
->后声明 - 函数体最后一个表达式自动成为返回值(无分号)
- 使用
return可以提前返回
语句 vs 表达式:
- 语句 :执行操作但不返回值(如
let x = 5;) - 表达式 :计算并返回值(如
5 + 3、{ let x = 5; x + 1 })
for 循环(在函数练习中出现):
rust
for i in 0..num {
println!("Ring! Call number {}", i + 1);
}
0..num是范围表达式,生成从0到num-1的序列
4. 条件控制流:if 表达式 (§3.5)
核心知识点
if 表达式语法:
rust
if condition {
// 代码块
} else if another_condition {
// 另一个代码块
} else {
// 默认代码块
}
重要特性:
- 条件必须 是
bool类型(不像某些语言可以是数字) if是表达式,可以返回值- 作为表达式使用时,所有分支必须返回相同类型
if 作为表达式:
rust
let x = if true { 5 } else { 6 }; // x = 5
pub 关键字:表示函数/结构体是公开的,可以被外部代码访问
rust
pub fn my_function() { // 公开函数
// ...
}
fn private_function() { // 私有函数(默认)
// ...
}
模块(mod):用于组织代码
rust
mod tests { // 定义模块
use super::*; // 导入父模块
#[test]
fn test_something() {
// ...
}
}
5. 基本数据类型 (§3.2, §4.3)
核心知识点
标量类型:
| 类型 | 说明 | 示例 |
|---|---|---|
bool |
布尔值 | true, false |
char |
Unicode字符(4字节) | 'a', '😄' |
i8/i16/i32/i64/i128/isize |
有符号整数 | 42 |
u8/u16/u32/u64/u128/usize |
无符号整数 | 42u32 |
f32/f64 |
浮点数 | 3.14 |
复合类型:
| 类型 | 说明 | 示例 |
|---|---|---|
| 元组(Tuple) | 固定长度,可包含不同类型 | let t: (i32, f64, bool) = (1, 2.5, true); |
| 数组(Array) | 固定长度,所有元素同类型 | let a: [i32; 5] = [1, 2, 3, 4, 5]; |
字符串 vs 字符:
char:单个Unicode字符,用单引号'a',占4字节&str:字符串切片,用双引号"hello",是字符的序列&'static str:具有整个程序生命周期的字符串切片(字符串字面量)
字符串字面量:
rust
let s1: &str = "hello"; // 字符串切片
let s2: &'static str = "world"; // 静态生命周期
数组特殊语法:
rust
let a = [3; 5]; // 创建[3, 3, 3, 3, 3]
切片(Slice):
rust
let a = [1, 2, 3, 4, 5];
let slice = &a[1..3]; // [2, 3]
- 包含起始索引,不包含结束索引
- 切片类型是
&[T]
数组/切片常用方法:
.len():返回长度.is_empty():是否为空.iter():创建迭代器
元组解构:
rust
let (x, y, z) = (1, 2.0, true); // 解构元组