Lối Nhỏ
← Chủ đề

Một buổi chiều với Rust và những lỗi borrow checker

15 tháng 6, 20261 phút đọc
lập trìnhrust
Cửa sổ terminal màu tối hiển thị thông báo lỗi biên dịch

Mình dành nguyên một buổi chiều thứ Bảy để viết lại một công cụ dòng lệnh nhỏ bằng Rust, thay vì Python như mọi khi. Lý do đơn giản: tò mò xem ownership thực sự khó đến mức nào.

Đoạn code đầu tiên gây lỗi trông như thế này:

fn main() {
    let data = String::from("xin chào");
    let first = take_ownership(data);
    println!("{}", data); // lỗi: data đã bị move
}

fn take_ownership(s: String) -> String {
    s
}

Trình biên dịch từ chối ngay lập tức, kèm một thông báo dài giải thích rằng data đã bị chuyển quyền sở hữu (move) vào hàm take_ownership, nên không thể dùng lại ở dòng sau. Cảm giác đầu tiên là khó chịu. Cảm giác thứ hai, sau khi hiểu ra, là nhẹ nhõm.

Borrow checker không phải kẻ thù

Python cho phép mình dùng lại biến ở bất kỳ đâu vì có garbage collector dọn dẹp phía sau. Cái giá phải trả là runtime overhead, và đôi khi là những bug khó tái hiện liên quan đến vòng đời đối tượng. Rust chọn cách ngược lại: bắt lỗi ngay lúc biên dịch, trước khi code chạy được dòng nào.

Sửa lại bằng cách mượn tham chiếu thay vì chuyển quyền sở hữu:

fn take_ownership(s: &String) -> &str {
    s
}

Chỉ một dấu & nhưng thay đổi hoàn toàn cách mình phải suy nghĩ về dữ liệu: ai đang giữ nó, trong bao lâu, và ai được phép đọc hay ghi.

Sau một buổi chiều, công cụ nhỏ chạy được. Nhưng thứ mình mang về nhiều hơn là một chương trình chạy đúng, là một cách tư duy mới về việc quản lý bộ nhớ mà trước giờ mình chưa từng phải để tâm.