Option

Chúng ta đã thấy một số cách dùng Option<T>. Kiểu dữ liệu này hoặc lưu trữ một giá trị kiểu T hoặc không lưu trữ gì cả. Ví dụ, hàm String::find trả về một Option<usize>.

fn main() {
    let name = Hoàng Hữu Văn A;
    let mut position: Option<usize> = name.find(ă);
    println!("find trả về {position:?}");
    assert_eq!(position.unwrap(), 14);
    position = name.find('Z');
    println!("find trả về {position:?}");
    assert_eq!(position.expect("Không tìm thấy ký tự"), 0);
}
This slide should take about 10 minutes.
  • Option được sử dụng rộng rãi ở nhiều nơi, không chỉ trong thư viện chuẩn.
  • unwrap sẽ trả về giá trị của Option hoặc panic. expect hoạt động tương tự nhưng có thể truyền thêm một thông báo lỗi.
    • Chương trình có thể panic khi gặp phải giá trị None, nhưng bạn không thể “vô tình” quên kiểm tra None.
    • Thông thường, ta có thể thoải mái sử dụng unwrap/expect khi thử nghiệm một ý tưởng mới, nhưng code production thường xử lý None một cách an toàn hơn.
  • Option<T> được tối ưu để chiếm bằng bộ nhớ như Ttrong đa số trường hợp.