Menu
CoddyTech

Lấy giá trị từ 'Option'

Thuộc phần Logic và luồng chương trình trong hành trình Rust của Coddy. Bài học 38 trên 66.

Đôi khi, bạn cần lấy giá trị thực tế từ một Option khi bạn chắc chắn rằng nó chứa một Some. Rust cung cấp phương thức .unwrap() cho mục đích này, phương thức này lấy giá trị ra khỏi một Some và trả trực tiếp giá trị đó cho bạn.

let maybe_number = Some(42);
let actual_number = maybe_number.unwrap();
println!("The number is: {}", actual_number);

Khi gọi .unwrap() trên Some(value), bạn nhận được giá trị bên trong. Trong ví dụ trên, actual_number trở thành 42, không còn được bọc trong Option.

Tuy nhiên, có một cảnh báo quan trọng: nếu bạn gọi .unwrap() trên None, chương trình sẽ gặp lỗi panic và dừng ngay lập tức. Vì vậy, .unwrap() là một phương thức có thể gây nguy hiểm, chỉ nên dùng khi bạn hoàn toàn chắc chắn rằng Option chứa Some.

let empty_option: Option<i32> = None;
let value = empty_option.unwrap(); // Lệnh này sẽ gây ra panic!

Chỉ dùng .unwrap() khi thật cần thiết và chỉ trong trường hợp bạn có thể đảm bảo Option chứa một giá trị, chẳng hạn như trong các ví dụ đơn giản hoặc khi bạn đã kiểm tra bằng .is_some().

challenge icon

Thử thách

Dễ

Bạn sẽ nhận hai đầu vào. Đầu vào thứ nhất là một số (dưới dạng chuỗi), còn đầu vào thứ hai cho biết số này nên được xem là hợp lệ hay không hợp lệ. Nếu đầu vào thứ hai là valid, hãy tạo một Option<i32> chứa Some với số đã phân tích. Nếu đầu vào thứ hai là invalid, hãy tạo một Option<i32> chứa None. Dùng .unwrap() để lấy giá trị từ Option và in ra giá trị đó.

Yêu cầu:

  • Đọc đầu vào thứ nhất và loại bỏ khoảng trắng
  • Đọc đầu vào thứ hai và loại bỏ khoảng trắng
  • Phân tích đầu vào thứ nhất thành i32 bằng .parse::<i32>()
  • Tạo một biến Option<i32>:
    • Nếu đầu vào thứ hai là valid, gán Some(parsed_number)
    • Nếu đầu vào thứ hai là invalid, gán None
  • Dùng .unwrap() để lấy giá trị từ Option
  • In giá trị đã lấy ra theo định dạng: Value: [number]

Đầu vào:

  • Dòng thứ nhất: Một số dưới dạng chuỗi (ví dụ: 42)
  • Dòng thứ hai: valid hoặc invalid

Đầu ra:

  • Nếu đầu vào thứ hai là valid: Value: [number]
  • Nếu đầu vào thứ hai là invalid: Chương trình sẽ hoảng loạn (đây là hành vi được mong đợi trong thử thách này)

Lưu ý: Khi đầu vào thứ hai là invalid, gọi .unwrap() trên None sẽ khiến chương trình hoảng loạn. Điều này cho thấy tính nguy hiểm của .unwrap() khi bạn không chắc chắn Option có chứa giá trị hay không.

Tự làm thử

use std::io;

fn main() {
    // Đọc đầu vào (input) thứ nhất (số ở dạng chuỗi (string))
    let mut number_input = String::new();
    io::stdin().read_line(&mut number_input).expect("Failed to read line");
    let number_input = number_input.trim();
    
    // Đọc đầu vào thứ hai (valid hoặc invalid)
    let mut validity_input = String::new();
    io::stdin().read_line(&mut validity_input).expect("Failed to read line");
    let validity_input = validity_input.trim();
    
    // Phân tích cú pháp số
    let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
    
    // TODO: Viết code bên dưới
    // Tạo một Option<i32> dựa trên validity_input
    // Nếu validity_input là "valid", gán Some(parsed_number)
    // Nếu validity_input là "invalid", gán None
    // Sau đó dùng .unwrap() để lấy giá trị (value) và in ra (print) theo định dạng: Value: [number]
    
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng chương trình

Tự luyện tập: Trình biên dịch Rust online