Rust基础语法¶
📚 章节概述¶
本章将介绍 Rust 的基础语法,包括变量、数据类型、函数和控制流。这些是编写 Rust 程序的基础,掌握它们将为后续学习打下坚实基础。
🎯 学习目标¶
- 理解 Rust 的变量和可变性
- 掌握基本数据类型
- 学会定义和使用函数
- 掌握控制流语句(if、loop、for、while)
- 理解注释的使用
📖 变量与可变性¶
1.1 变量声明¶
在 Rust 中,变量默认是不可变的:
Rust
fn main() { // fn main() Rust程序入口函数
let x = 5;
println!("The value of x is: {}", x);
x = 6; // 编译错误!不能给不可变变量赋值
}
1.2 可变变量¶
使用 mut 关键字声明可变变量:
Rust
fn main() {
let mut x = 5; // let mut 声明可变变量
println!("The value of x is: {}", x);
x = 6;
println!("The value of x is: {}", x);
}
1.3 变量遮蔽¶
Rust 允许声明同名变量,这称为遮蔽:
Rust
fn main() {
let x = 5;
let x = x + 1;
let x = x * 2;
println!("The value of x is: {}", x); // 输出 12
}
遮蔽与 mut 的区别: - 遮蔽创建新变量,可以改变类型 - mut 修改同一变量,不能改变类型
Rust
fn main() {
let spaces = " ";
let spaces = spaces.len(); // 遮蔽,改变类型
println!("spaces: {}", spaces);
// 不能这样做:
// let mut spaces = " ";
// spaces = spaces.len(); // 编译错误!类型不匹配
}
🔢 数据类型¶
2.1 标量类型¶
整数类型¶
| 长度 | 有符号 | 无符号 |
|---|---|---|
| 8-bit | i8 | u8 |
| 16-bit | i16 | u16 |
| 32-bit | i32 | u32 |
| 64-bit | i64 | u64 |
| 128-bit | i128 | u128 |
| arch | isize | usize |
Rust
fn main() {
let decimal = 98_222; // 十进制
let hex = 0xff; // 十六进制
let octal = 0o77; // 八进制
let binary = 0b1111_0000; // 二进制
let byte = b'A'; // 字节(仅限 u8)
println!("decimal: {}", decimal);
println!("hex: {}", hex);
println!("octal: {}", octal);
println!("binary: {}", binary);
println!("byte: {}", byte);
}
浮点类型¶
布尔类型¶
字符类型¶
Rust
fn main() {
let c = 'z';
let z = 'ℤ';
let heart_eyed_cat = '😻';
println!("c: {}, z: {}, cat: {}", c, z, heart_eyed_cat);
}
2.2 复合类型¶
元组¶
元组可以将多个类型的值组合到一个复合类型中:
Rust
fn main() {
let tup: (i32, f64, u8) = (500, 6.4, 1);
// 解构元组
let (x, y, z) = tup;
println!("The value of y is: {}", y);
// 访问元组元素
let five_hundred = tup.0;
let six_point_four = tup.1;
let one = tup.2;
println!("tup.0: {}, tup.1: {}, tup.2: {}", five_hundred, six_point_four, one);
}
数组¶
数组中所有元素的类型必须相同:
Rust
fn main() {
let a = [1, 2, 3, 4, 5];
let months = ["January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"];
// 访问数组元素
let first = a[0];
let second = a[1];
println!("first: {}, second: {}", first, second);
}
数组越界:
📝 函数¶
3.1 函数定义¶
Rust
fn main() {
println!("Hello, world!");
another_function();
}
fn another_function() {
println!("Another function.");
}
3.2 参数¶
Rust
fn main() {
another_function(5);
print_labeled_measurement(5, 'h');
}
fn another_function(x: i32) {
println!("The value of x is: {}", x);
}
fn print_labeled_measurement(value: i32, unit_label: char) {
println!("The measurement is: {}{}", value, unit_label);
}
3.3 语句和表达式¶
Rust 是基于表达式的语言:
Rust
fn main() {
// 语句(不返回值)
let y = 6;
// 表达式(返回值)
let x = {
let y = 3;
y + 1 // 注意:没有分号
};
println!("The value of x is: {}", x);
}
3.4 返回值¶
Rust
fn main() {
let x = plus_one(5);
println!("The value of x is: {}", x);
}
fn plus_one(x: i32) -> i32 {
x + 1 // 表达式,返回值
// x + 1; // 语句,编译错误!
}
🔄 控制流¶
4.1 if 表达式¶
Rust
fn main() {
let number = 6;
if number < 5 {
println!("condition was true");
} else {
println!("condition was false");
}
}
if 是表达式:
Rust
fn main() {
let condition = true;
let number = if condition { 5 } else { 6 };
println!("The value of number is: {}", number);
}
多重条件:
Rust
fn main() {
let number = 6;
if number % 4 == 0 {
println!("number is divisible by 4");
} else if number % 3 == 0 {
println!("number is divisible by 3");
} else if number % 2 == 0 {
println!("number is divisible by 2");
} else {
println!("number is not divisible by 4, 3, or 2");
}
}
4.2 循环¶
loop¶
从循环返回值:
Rust
fn main() {
let mut counter = 0;
let result = loop {
counter += 1;
if counter == 10 {
break counter * 2;
}
};
println!("The result is {}", result);
}
while¶
Rust
fn main() {
let mut number = 3;
while number != 0 {
println!("{}!", number);
number -= 1;
}
println!("LIFTOFF!!!");
}
for¶
Rust
fn main() {
let a = [10, 20, 30, 40, 50];
for element in a {
println!("the value is: {}", element);
}
}
范围:
Rust
fn main() {
for number in 1..4 {
println!("{}!", number);
}
println!("LIFTOFF!!!");
// 包含结束值
for number in 1..=4 {
println!("{}!", number);
}
}
反向遍历:
💬 注释¶
5.1 普通注释¶
Rust
fn main() {
// 这是一个单行注释
/*
* 这是一个多行注释
* 可以跨越多行
*/
let x = 5 + /* 90 + */ 5; // 行内注释
println!("The value of x is: {}", x);
}
5.2 文档注释¶
Rust
/// 计算两个数的和
///
/// # 参数
/// * `a` - 第一个数
/// * `b` - 第二个数
///
/// # 返回值
/// 返回两个数的和
fn add(a: i32, b: i32) -> i32 {
a + b
}
📝 练习题¶
练习 1:温度转换¶
编写一个函数,将摄氏温度转换为华氏温度:
Rust
fn celsius_to_fahrenheit(celsius: f64) -> f64 {
// TODO: 实现转换公式
// F = C × 9/5 + 32
todo!()
}
fn main() {
let celsius = 25.0;
let fahrenheit = celsius_to_fahrenheit(celsius);
println!("{}°C = {}°F", celsius, fahrenheit);
}
练习 2:斐波那契数列¶
使用循环生成前 n 个斐波那契数:
Rust
fn fibonacci(n: usize) -> Vec<u64> {
// TODO: 实现斐波那契数列生成
todo!()
}
fn main() {
let n = 10;
let fib = fibonacci(n);
println!("前 {} 个斐波那契数: {:?}", n, fib);
}
练习 3:素数判断¶
编写函数判断一个数是否为素数:
Rust
fn is_prime(n: u32) -> bool {
// TODO: 实现素数判断
todo!()
}
fn main() {
let numbers = [2, 3, 4, 5, 6, 7, 8, 9, 10];
for &num in &numbers {
println!("{} is prime: {}", num, is_prime(num));
}
}
练习 4:猜数字游戏¶
实现一个简单的猜数字游戏:
Rust
use std::io;
use std::cmp::Ordering;
use rand::Rng;
fn main() {
println!("猜数字游戏!");
let secret_number = rand::thread_rng().gen_range(1..=100);
// TODO: 实现游戏逻辑
// 1. 提示用户输入猜测
// 2. 读取用户输入
// 3. 比较猜测和秘密数字
// 4. 给出提示(太大、太小或正确)
// 5. 循环直到猜对
}
💡 最佳实践¶
1. 使用有意义的变量名¶
Rust
// 好的变量名
let user_name = "Alice";
let total_price = 100.50;
// 不好的变量名
let x = "Alice";
let y = 100.50;
2. 使用适当的数据类型¶
Rust
// 使用 usize 表示索引
let index: usize = 0;
// 使用 f64 进行浮点运算
let pi: f64 = 3.14159265359;
// 使用 bool 表示布尔值
let is_active: bool = true;
3. 避免魔法数字¶
Rust
// 不好
let area = 3.14159 * radius * radius;
// 好
const PI: f64 = 3.14159265359;
let area = PI * radius * radius;
4. 使用表达式而不是语句¶
Rust
// 不好
fn get_status(code: i32) -> &'static str {
if code == 200 {
return "OK";
} else {
return "Error";
}
}
// 好
fn get_status(code: i32) -> &'static str {
if code == 200 {
"OK"
} else {
"Error"
}
}
⚠️ 常见错误¶
1. 忘记使用 mut¶
2. 数组越界¶
Rust
// 错误(运行时 panic)
let a = [1, 2, 3];
let x = a[3];
// 正确
let a = [1, 2, 3];
if let Some(&x) = a.get(3) {
println!("{}", x);
} else {
println!("Index out of bounds");
}
3. 类型不匹配¶
📚 扩展阅读¶
🎯 本章小结¶
本章介绍了 Rust 的基础语法,包括:
- ✅ 变量和可变性
- ✅ 基本数据类型(整数、浮点数、布尔、字符)
- ✅ 复合类型(元组、数组)
- ✅ 函数定义和使用
- ✅ 控制流(if、loop、while、for)
- ✅ 注释的使用
下一章: 我们将学习 Rust 最核心的概念——所有权与借用系统。