Menu
CoddyTech

Cung cấp giá trị mặc định: unwrap_or

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 40 trên 66.

Mặc dù .unwrap() và .expect() có thể lấy giá trị từ Option, cả hai đều có một nhược điểm lớn: chúng gây panic khi gặp None. Để viết code an toàn hơn, Rust cung cấp .unwrap_or(), một phương thức không bao giờ gây panic.

Phương thức .unwrap_or() nhận một giá trị mặc định làm đối số. Nếu Option chứa Some, phương thức trả về giá trị bên trong. Nếu là None, phương thức trả về giá trị mặc định mà bạn đã cung cấp:

let maybe_score = Some(85);
let score = maybe_score.unwrap_or(0);
println!("Score: {}", score); // In ra: Score: 85

let no_score: Option = None;
let default_score = no_score.unwrap_or(0);
println!("Score: {}", default_score); // In ra: Score: 0

Cách này an toàn hơn nhiều so với .unwrap() vì chương trình sẽ không bao giờ gặp sự cố, bạn luôn nhận được một giá trị có thể sử dụng.

challenge icon

Thử thách

Dễ

Bạn sẽ nhận hai đầu vào. Đầu vào thứ nhất là điểm số (dưới dạng số), còn đầu vào thứ hai cho biết điểm số có sẵn hay không (yes nghĩa là có, no nghĩa là không). Tạo một Option<i32> dựa trên trạng thái có sẵn. Dùng .unwrap_or() để lấy điểm số an toàn, với giá trị mặc định là 50, sau đó in ra điểm số cuối cùng.

Yêu cầu:

  • Đọc đầu vào thứ nhất (điểm số) và xóa khoảng trắng ở đầu, cuối
  • Phân tích đầu vào thứ nhất thành i32
  • Đọc đầu vào thứ hai (trạng thái có sẵn) và xóa khoảng trắng ở đầu, cuối
  • Tạo một biến (variable) có kiểu Option<i32>:
    • Nếu trạng thái có sẵn là yes, gán Some(score)
    • Nếu trạng thái có sẵn là no, gán None
  • Dùng .unwrap_or(50) để lấy điểm số với giá trị mặc định là 50
  • In ra điểm số cuối cùng theo định dạng: Final score: [score]

Đầu vào:

  • Dòng thứ nhất: Một số biểu thị điểm số (ví dụ: 85)
  • Dòng thứ hai: yes hoặc no

Đầu ra:

  • Nếu trạng thái có sẵn là yes: Final score: [score] (điểm số thực tế)
  • Nếu trạng thái có sẵn là no: Final score: 50 (giá trị mặc định)

Tự làm thử

use std::io;

fn main() {
    // Đọc điểm số
    let mut score_input = String::new();
    io::stdin().read_line(&mut score_input).expect("Failed to read line");
    let score: i32 = score_input.trim().parse().expect("Invalid number");
    
    // Đọc trạng thái khả dụng
    let mut availability = String::new();
    io::stdin().read_line(&mut availability).expect("Failed to read line");
    let availability = availability.trim();
    
    // TODO: Viết code bên dưới
    // Tạo một Option<i32> dựa trên trạng thái khả dụng
    // Dùng .unwrap_or(50) để lấy điểm số cuối cùng
    
    
    // In kết quả ra
    println!("Final score: {}", final_score);
}
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