Menu
CoddyTech

Dùng 'match' với 'Result'

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

Bây giờ bạn đã hiểu Result là gì, hãy cùng tìm hiểu cách tường minh và mạnh mẽ nhất để xử lý cả trường hợp thành công lẫn thất bại: dùng biểu thức match.

Tương tự như với Option, match buộc bạn xử lý cả hai biến thể của Result. Bạn tạo một nhánh cho Ok để xử lý trường hợp thành công và một nhánh khác cho Err để xử lý trường hợp thất bại:

let result = divide(10, 2);

match result {
    Ok(value) => println!("Division successful: {}", value),
    Err(error) => println!("Division failed: {}", error),
}

Khi Result là Ok, match trích xuất giá trị thành công và thực thi nhánh đầu tiên. Khi là Err, nó trích xuất thông tin lỗi và thực thi nhánh thứ hai. Mẫu này giúp bạn không bao giờ vô tình bỏ qua một lỗi tiềm ẩn.

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), đầu vào thứ hai là một số khác (dưới dạng chuỗi). Tạo một hàm (function) thử chia số thứ nhất cho số thứ hai và trả về một Result<f64, &'static str>. Nếu số thứ hai bằng không, hãy trả về Err với thông báo "Division by zero". Nếu không, hãy trả về Ok cùng kết quả phép chia. Dùng biểu thức match để xử lý cả trường hợp Ok và Err, rồi in ra thông báo phù hợp.

Yêu cầu:

  • Đọc đầu vào thứ nhất (số bị chia) và loại bỏ khoảng trắng
  • Phân tích đầu vào thứ nhất thành f64
  • Đọc đầu vào thứ hai (số chia) và loại bỏ khoảng trắng
  • Phân tích đầu vào thứ hai thành f64
  • Tạo một hàm nhận hai tham số f64 và trả về Result<f64, &'static str>
  • Bên trong hàm, kiểm tra xem số chia có bằng 0.0 không:
    • Nếu có, trả về Err("Division by zero")
    • Nếu không, trả về Ok(dividend / divisor)
  • Gọi hàm với hai số đã phân tích
  • Dùng biểu thức match để xử lý Result
  • Trong nhánh Ok(value), in ra: Result: [value]
  • Trong nhánh Err(error), in ra: Error: [error]

Đầu vào:

  • Dòng thứ nhất: Một số biểu thị số bị chia (ví dụ: 10.0)
  • Dòng thứ hai: Một số biểu thị số chia (ví dụ: 2.0)

Đầu ra:

  • Nếu phép chia thành công: Result: [result]
  • Nếu chia cho không: Error: Division by zero

Tự làm thử

use std::io;

// TODO: Tạo hàm (function) divide trả về Result<f64, &'static str> tại đây


fn main() {
    // Đọc đầu vào đầu tiên (số bị chia)
    let mut dividend_input = String::new();
    io::stdin().read_line(&mut dividend_input).expect("Failed to read line");
    let dividend: f64 = dividend_input.trim().parse().expect("Invalid number");
    
    // Đọc đầu vào thứ hai (số chia)
    let mut divisor_input = String::new();
    io::stdin().read_line(&mut divisor_input).expect("Failed to read line");
    let divisor: f64 = divisor_input.trim().parse().expect("Invalid number");
    
    // TODO: Gọi hàm divide và dùng match để xử lý Result
    // In "Result: [value]" khi nhận Ok
    // In "Error: [error]" khi nhận Err
}
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