📦 Mảng: Danh Sách Có Độ Dài Cố Định
Mục Tiêu Bài Học
Sau bài này, bạn sẽ:
- ✅ Biết cách khai báo và khởi tạo arrays
- ✅ Truy cập và thay đổi phần tử trong array
- ✅ Hiểu về array slices
- ✅ Biết khi nào dùng array vs vector
🤔 Tại Sao Cần Arrays?
Giả sử bạn muốn lưu điểm 5 môn học:
// ❌ Cách tệ - Nhiều biến
let diem_mon1 = 85;
let diem_mon2 = 90;
let diem_mon3 = 78;
let diem_mon4 = 92;
let diem_mon5 = 88;
Vấn đề:
- ❌ Quá nhiều biến riêng lẻ
- ❌ Khó quản lý và xử lý
- ❌ Không thể lặp qua dễ dàng
Giải pháp: Dùng Array! 📦
// ✅ Tốt hơn - Một array
let diem = [85, 90, 78, 92, 88];
📝 Array Là Gì?
Array (mảng) là một collection chứa nhiều giá trị:
- Cùng kiểu dữ liệu (tất cả i32, hoặc tất cả &str, ...)
- Độ dài cố định (không thay đổi sau khi tạo)
- Lưu trên stack (nhanh!)
Ẩn Dụ
Hãy tưởng tượng array như một hàng tủ đồ bảo hộ cố định:
- 🏷️ Tủ 1: Mũ bảo hiểm
- 🏷️ Tủ 2: Găng tay
- 🏷️ Tủ 3: Giày an toàn
- 🏷️ Tủ 4: Kính bảo hộ
- 🏷️ Tủ 5: Áo phản quang
Đặc điểm:
- Số lượng tủ cố định (5 cái)
- Mỗi tủ chỉ chứa một loại đồ (cùng kiểu)
- Không thể thêm/bớt tủ sau khi xây! 🛡️
📝 Khai Báo Array
Cú Pháp 1: Liệt Kê Giá Trị
let tên_array: [kiểu; độ_dài] = [giá_trị1, giá_trị2, ...];
Ví Dụ
fn main() {
let so: [i32; 5] = [10, 20, 30, 40, 50];
println!("Array: {:?}", so);
}
Kết quả:
Array: [10, 20, 30, 40, 50]
Giải thích:
[i32; 5]→ Array chứa 5 phần tử kiểu i32[10, 20, 30, 40, 50]→ Các giá trị
Cú Pháp 2: Giá Trị Giống Nhau
let tên_array = [giá_trị; số_lượng];
fn main() {
let zeros = [0; 5]; // [0, 0, 0, 0, 0]
println!("Zeros: {:?}", zeros);
}
Kết quả:
Zeros: [0, 0, 0, 0, 0]
🔍 Truy Cập Phần Tử
Dùng index (chỉ số) để truy cập phần tử. Index bắt đầu từ 0!
fn main() {
let mon_hoc = ["Toán", "Lý", "Hóa", "Sinh", "Anh"];
println!("Môn đầu tiên: {}", mon_hoc[0]); // Index 0
println!("Môn thứ hai: {}", mon_hoc[1]); // Index 1
println!("Môn cuối: {}", mon_hoc[4]); // Index 4
}
Kết quả:
Môn đầu tiên: Toán
Môn thứ hai: Lý
Môn cuối: Anh
Lưu ý: Index từ 0 đến n-1 (với n là độ dài array)
Array: ["Toán", "Lý", "Hóa", "Sinh", "Anh"]
Index: 0 1 2 3 4
✏️ Thay Đổi Phần Tử
Dùng mut để array có thể thay đổi:
fn main() {
let mut diem = [75, 82, 90, 68, 95];
println!("Trước: {:?}", diem);
diem[1] = 85; // Thay đổi phần tử thứ 2
diem[3] = 72; // Thay đổi phần tử thứ 4
println!("Sau: {:?}", diem);
}
Kết quả:
Trước: [75, 82, 90, 68, 95]
Sau: [75, 85, 90, 72, 95]
📏 Độ Dài Array
Dùng .len() để lấy độ dài:
fn main() {
let numbers = [10, 20, 30, 40, 50];
println!("Độ dài array: {}", numbers.len());
println!("Phần tử cuối: {}", numbers[numbers.len() - 1]);
}
Kết quả:
Độ dài array: 5
Phần tử cuối: 50
🔄 Lặp Qua Array
Cách 1: For Loop Đơn Giản
fn main() {
let fruits = ["Táo", "Cam", "Chuối", "Xoài"];
for fruit in fruits {
println!("🍎 {}", fruit);
}
}
Kết quả:
🍎 Táo
🍎 Cam
🍎 Chuối
🍎 Xoài
Cách 2: Với Index
fn main() {
let diem = [85, 92, 78, 95, 88];
for i in 0..diem.len() {
println!("Môn {} - Điểm: {}", i + 1, diem[i]);
}
}
Kết quả:
Môn 1 - Điểm: 85
Môn 2 - Điểm: 92
Môn 3 - Điểm: 78
Môn 4 - Điểm: 95
Môn 5 - Điểm: 88
Cách 3: Với Enumerate
fn main() {
let colors = ["Đỏ", "Xanh", "Vàng"];
for (index, color) in colors.iter().enumerate() {
println!("Màu {} - {}", index + 1, color);
}
}
Kết quả:
Màu 1 - Đỏ
Màu 2 - Xanh
Màu 3 - Vàng
🔪 Array Slices
Slice là một "lát cắt" của array - tham chiếu đến một phần của array.
Cú Pháp
let slice = &array[start..end];
Ví Dụ
fn main() {
let numbers = [10, 20, 30, 40, 50];
let slice1 = &numbers[1..4]; // Index 1-3 (không bao gồm 4)
let slice2 = &numbers[..3]; // Từ đầu đến index 2
let slice3 = &numbers[2..]; // Từ index 2 đến cuối
let slice4 = &numbers[..]; // Toàn bộ array
println!("Slice 1: {:?}", slice1); // [20, 30, 40]
println!("Slice 2: {:?}", slice2); // [10, 20, 30]
println!("Slice 3: {:?}", slice3); // [30, 40, 50]
println!("Slice 4: {:?}", slice4); // [10, 20, 30, 40, 50]
}
Kết quả:
Slice 1: [20, 30, 40]
Slice 2: [10, 20, 30]
Slice 3: [30, 40, 50]
Slice 4: [10, 20, 30, 40, 50]
Mẹo Nhớ
a..b→ Từ a đến b-1..b→ Từ đầu đến b-1a..→ Từ a đến cuối..→ Toàn bộ
let arr = [1, 2, 3, 4, 5];
// 0 1 2 3 4 (index)
&arr[1..4] // [2, 3, 4]
&arr[..3] // [1, 2, 3]
&arr[2..] // [3, 4, 5]
&arr[..] // [1, 2, 3, 4, 5]
🎮 Ví Dụ Thực Tế: Tính Điểm Trung Bình
fn main() {
let diem_thi = [85, 92, 78, 95, 88];
let mut tong = 0;
println!("📊 Điểm các môn:");
for (i, &diem) in diem_thi.iter().enumerate() {
println!("Môn {}: {}", i + 1, diem);
tong += diem;
}
let trung_binh = tong as f64 / diem_thi.len() as f64;
println!("\n📈 Điểm trung bình: {:.2}", trung_binh);
if trung_binh >= 80.0 {
println!("🎉 Học lực: Giỏi!");
} else if trung_binh >= 65.0 {
println!("😊 Học lực: Khá!");
} else {
println!("😐 Học lực: Trung bình!");
}
}
Kết quả:
📊 Điểm các môn:
Môn 1: 85
Môn 2: 92
Môn 3: 78
Môn 4: 95
Môn 5: 88