🦀 Rust 入门教程(二):基础语法与数据类型详解
在上一篇文章中,我们完成了 Rust 的安装和第一个 “Hello, world” 项目。这篇文章将继续深入,带你了解 Rust 的基础语法和常用数据类型,这部分是写好任何一个 Rust 程序的基石。
🔧 1. 变量与可变性(mut)
Rust 默认所有变量都是不可变的(immutable)。这与很多语言(如 Python、JavaScript)不同,它的初衷是为了提升代码的安全性和可预测性。
不可变变量示例
fn main() {let x = 5;println!("x 的值是: {}", x);// x = 6; // ❌ 编译错误:cannot assign twice to immutable variable
}
可变变量(使用 mut
)
如果你确实需要修改变量,可以用 mut
:
fn main() {let mut y = 10;println!("y 初始值: {}", y);y = 20;println!("y 修改后: {}", y);
}
📊 2. 基本数据类型
Rust 是一门静态强类型语言,编译器会在编译阶段就进行类型检查。你可以显式声明类型,也可以依靠类型推导(type inference)。
整数类型(默认 i32
)
let a: i32 = 100;
let b: u8 = 255;
类型 | 大小 | 是否有符号 |
i8 | 8位 | 有符号 |
u8 | 8位 | 无符号 |
i32 | 32位 | 有符号 |
u64 | 64位 | 无符号 |
isize | 平台相关 | 有符号 |
usize | 平台相关 | 无符号 |
浮点类型(f32
/ f64
)
let pi: f64 = 3.1415;
let e = 2.71828; // 默认是 f64
布尔类型(bool
)
let is_active: bool = true;
字符类型(char
)
let letter = 'A';
let emoji = '🦀'; // Rust 的 char 是 4 字节,支持 Unicode!
🧱 3. 元组(Tuple)
元组可以包含不同类型的多个值。
fn main() {let person: (&str, i32, bool) = ("Alice", 30, true);println!("姓名: {}, 年龄: {}, 是否活跃: {}", person.0, person.1, person.2);
}
解构元组
let (name, age, active) = person;
📦 4. 数组(Array)
数组是固定长度的同类型元素集合。
fn main() {let numbers = [1, 2, 3, 4, 5];println!("第一个元素是: {}", numbers[0]);
}
显式声明类型和长度
let arr: [i32; 3] = [10, 20, 30];
初始化相同元素
let zeros = [0; 5]; // [0, 0, 0, 0, 0]
❗ 注意:访问越界数组元素会触发运行时 panic。
🔒 5. 常量(const)与变量遮蔽(shadowing)
const
常量
常量在声明时必须指定类型,并且必须是编译期可求值的表达式:
const MAX_USERS: u32 = 1000;
与 let
的区别:
特性 | const | let |
是否可变 | ❌ 不可变 | ✅ 默认不可变 |
是否编译期求值 | ✅ 必须 | ❌ 可以运行期计算 |
作用域 | 全局或局部 | 局部块内 |
变量遮蔽(Shadowing)
Rust 允许用相同变量名重新声明变量,这称为变量遮蔽。
fn main() {let x = 5;let x = x + 1; // 重新声明并赋值{let x = x * 2; // 在新作用域中再次遮蔽println!("作用域内 x: {}", x); // 12}println!("作用域外 x: {}", x); // 6
}
变量遮蔽的好处:
- 可改变变量类型
- 可避免
mut
带来的副作用
📌 总结
今天我们学习了 Rust 最基础也最重要的语法和数据类型:
✅ Rust 默认变量不可变,推荐优先使用不可变变量
✅ 类型系统严谨,但也支持类型推导
✅ 元组和数组是常用的集合类型
✅ 常量用 const
,变量可以通过 Shadowing 重新声明