🔄 Mượn Dữ Liệu: Borrowing
🎯 Mục Tiêu Bài Học
Sau khi hoàn thành bài học này, bạn sẽ:
- ✅ Hiểu được borrowing (mượn) trong Rust là gì
- ✅ Sử dụng immutable references (
&T) - ✅ Sử dụng mutable references (
&mut T) - ✅ Nắm vững quy tắc "một &mut HOẶC nhiều &"
- ✅ Tránh được lỗi borrow checker thường gặp
- ✅ Hiểu lifetime của references
🤔 Borrowing Là Gì?
Ẩn Dụ Cuộc Sống: Mượn Sách
Borrowing giống như việc mượn sách từ bạn:
🎒 Ownership (Sở Hữu):
- Bạn sở hữu cuốn sách → Bạn có thể làm gì tùy thích
- Cho đi, viết vào, bán, giữ lại
📖 Immutable Borrow (Mượn Đọc):
- Cho nhiều người mượn đọc cùng lúc → Tất cả chỉ đọc, không sửa
- An toàn vì không ai thay đổi nội dung
- Nhiều người có thể đọc đồng thời
✏️ Mutable Borrow (Mượn Ghi):
- Chỉ cho 1 người mượn để viết thêm → Người đó có thể sửa đổi
- Không cho ai khác đọc hoặc viết trong lúc đó
- Tránh xung đột khi sửa đổi
Tại Sao Cần Borrowing?
fn main() {
let s = String::from("xin chào");
// ❌ Không dùng borrowing - ownership bị move
in_chuoi(s);
// println!("{}", s); // Lỗi! s đã bị move
// ✅ Dùng borrowing - vẫn giữ ownership
let s2 = String::from("xin chào");
in_chuoi_borrowed(&s2);
println!("{}", s2); // OK! s2 vẫn dùng được
}
fn in_chuoi(s: String) {
println!("{}", s);
}
fn in_chuoi_borrowed(s: &String) {
println!("{}", s);
}
Lợi ích:
- ✅ Không mất ownership
- ✅ Không cần clone (tiết kiệm bộ nhớ)
- ✅ An toàn với borrow checker
📖 Immutable References (&T)
Cú Pháp Cơ Bản
fn main() {
let s = String::from("hello");
// Tạo reference
let r = &s;
println!("s: {}", s); // OK
println!("r: {}", r); // OK
}
Giải thích:
&s→ Tạo reference đếnsr→ Chứa địa chỉ củas, không sở hữu giá trị- Cả
svàrđều có thể đọc
Nhiều Immutable References
fn main() {
let s = String::from("Rust");
let r1 = &s;
let r2 = &s;
let r3 = &s;
println!("{} {} {}", r1, r2, r3); // Tất cả OK!
}
Quy tắc: Có thể có NHIỀU immutable references cùng lúc