🐛 Lỗi Là Bạn, Không Phải Kẻ Thù!
Giới Thiệu
Errors (lỗi) là phần không thể tránh khỏi khi lập trình. Tin tốt: Rust compiler là giáo viên tốt nhất!
Giải Thích Cho Bạn 5 Tuổi
Lỗi giống như giáo viên chữa bài:
- ✏️ Bạn làm bài tập
- 👨🏫 Thầy kiểm tra
- ❌ Thầy khoanh chỗ sai
- 💡 Thầy giải thích tại sao sai
- ✅ Bạn sửa và học được điều mới!
Rust compiler = Thầy giáo siêu tốt!
- 🔍 Tìm lỗi rất kỹ
- 📖 Giải thích rất rõ
- 💡 Gợi ý cách sửa
- 🎓 Dạy bạn cách viết code tốt hơn
Đừng sợ lỗi - Hãy đọc kỹ và học! 🦀✨
🎯 Hai Loại Lỗi Chính
1. Compile-Time Errors (Lỗi Biên Dịch)
Lỗi khi compile - Compiler bắt được!
fn main() {
let x = 5;
x = 10; // ❌ Error! x is immutable
}
✅ Ưu điểm: Bắt lỗi TRƯỚC KHI chạy!
2. Runtime Errors (Lỗi Khi Chạy)
Lỗi khi chạy - Program crash!
fn main() {
let numbers = vec![1, 2, 3];
let x = numbers[10]; // ❌ Panic! Index out of bounds
}
⚠️ Nguy hiểm hơn: User gặp lỗi!
📖 Đọc Error Messages
Cấu Trúc Error Message
error[E0384]: cannot assign twice to immutable variable `x`
--> src/main.rs:3:5
|
2 | let x = 5;
| - first assignment to `x`
3 | x = 10;
| ^^^^^^ cannot assign twice to immutable variable
|
help: consider making this binding mutable
|
2 | let mut x = 5;
| +++
Phần quan trọng:
- Error code:
E0384 - Mô tả: "cannot assign twice..."
- Vị trí:
src/main.rs:3:5 - Context: Hiển thị code xung quanh
- Giải thích: Tại sao lỗi
- Gợi ý:
help: consider making...
Ví Dụ Chi Tiết
fn main() {
let name = "An";
name = "Bình"; // ❌ Error!
}
Error message:
error[E0384]: cannot assign twice to immutable variable `name`
--> src/main.rs:3:5
|
2 | let name = "An";
| ---- first assignment to `name`
3 | name = "Bình";
| ^^^^^^^^^^^^ cannot assign twice to immutable variable
|
help: consider making this binding mutable
|
2 | let mut name = "An";
| +++
Cách đọc:
- ❌ Vấn đề: Gán 2 lần cho immutable variable
- 📍 Ở đâu: Dòng 3
- 💡 Giải pháp: Thêm
mut
🔧 Lỗi Thường Gặp
1. Immutable Variable
fn main() {
let x = 5;
x = 10; // ❌ Error!
}
Error:
cannot assign twice to immutable variable
Fix:
fn main() {
let mut x = 5; // ✅ Thêm mut
x = 10;
}
2. Type Mismatch
fn main() {
let x: i32 = "5"; // ❌ Error!
}
Error:
expected `i32`, found `&str`
Fix:
fn main() {
let x: i32 = 5; // ✅ Đúng type
// Hoặc parse
let x: i32 = "5".parse().expect("Not a number");
}
3. Variable Not Found
fn main() {
println!("{}", x); // ❌ Error! x chưa được khai báo
}
Error:
cannot find value `x` in this scope
Fix:
fn main() {
let x = 5; // ✅ Khai báo trước
println!("{}", x);
}
4. Missing Semicolon
fn main() {
let x = 5
let y = 10; // ❌ Error!
}
Error:
expected `;`, found `let`
Fix:
fn main() {
let x = 5; // ✅ Thêm ;
let y = 10;
}
5. Unused Variable
fn main() {
let x = 5; // ⚠️ Warning! x không dùng
}
Warning:
warning: unused variable: `x`
Fix - Cách 1: Dùng biến
fn main() {
let x = 5;
println!("{}", x); // ✅ Dùng x
}
Fix - Cách 2: Underscore prefix
fn main() {
let _x = 5; // ✅ _ = "tôi biết không dùng"
}
6. Moved Value
fn main() {
let s = String::from("hello");
take_ownership(s);
println!("{}", s); // ❌ Error! s đã moved
}
fn take_ownership(text: String) {
println!("{}", text);
}
Error:
borrow of moved value: `s`
Fix - Cách 1: Borrow
fn main() {
let s = String::from("hello");
take_ownership(&s); // ✅ Borrow
println!("{}", s); // ✅ Vẫn có s!
}
fn take_ownership(text: &String) {
println!("{}", text);
}
Fix - Cách 2: Clone
fn main() {
let s = String::from("hello");
take_ownership(s.clone()); // ✅ Clone
println!("{}", s); // ✅ Vẫn có s!
}
fn take_ownership(text: String) {
println!("{}", text);
}
7. Index Out of Bounds
fn main() {
let numbers = vec![1, 2, 3];
let x = numbers[10]; // ❌ Panic!
}
Runtime error:
thread 'main' panicked at 'index out of bounds'
Fix - Cách 1: Check trước
fn main() {
let numbers = vec![1, 2, 3];
if 10 < numbers.len() {
let x = numbers[10];
} else {
println!("Index quá lớn!");
}
}
Fix - Cách 2: Dùng .get()
fn main() {
let numbers = vec![1, 2, 3];
match numbers.get(10) {
Some(x) => println!("Giá trị: {}", x),
None => println!("Index không tồn tại!"),
}
}