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: 0Cá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.
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ánSome(score) - Nếu trạng thái có sẵn là
no, gánNone
- Nếu trạng thái có sẵn là
- 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:
yeshoặcno
Đầ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);
}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
1Luồng điều khiển nâng cao
Biểu thức 'match'Khớp nhiều giá trịKhớp các phạm viBiểu thức 'if let'Vòng lặp dưới dạng biểu thứcÔn tập: Trình phân tích cú pháp lệnh đơn giản4Nhóm dữ liệu bằng Struct
Struct là gì?Tổng quan về StructTruy cập các trường của StructStruct có thể thay đổiStruct làm tham số cho hàmStruct dạng tupleÔn tập: Tạo Struct Book2Giới thiệu về vector
Vector là gì?Tạo vectorThêm phần tử bằng pushTruy cập phần tử trong vectorLặp qua vectorLặp có thể thay đổiXóa phần tửÔn tập: Bộ theo dõi điểm số cơ bản5Cặp khóa-giá trị với bảng băm
Bảng băm là gì?Tạo bảng bămThêm cặp khóa-giá trịTruy cập giá trịDuyệt qua bảng bămCập nhật giá trịXóa một cặpÔn tập: Bộ đếm từ8Dự án: Quản lý kho hàng đơn giản
Thiết lập dự ánThêm mặt hàngKiểm tra hàng tồn khoBán mặt hàngKết hợp tất cả11Thử thách cuối cùng
Ôn tập: Các mục duy nhấtÔn tập: Trình xác thực hồ sơ người dùngÔn tập: Tổng hợp điểm3Danh sách việc cần làm trên dòng lệnh
Thiết lập dự ánThêm một việcXem tất cả việcXóa một việcCode hoàn chỉnh6Xử lý giá trị vắng mặt với 'Option'
'Option' là gì?Dùng 'match' với 'Option'is_some() và is_none()Lấy giá trị từ 'Option'expectCung cấp giá trị mặc định: unwrap_orÔn tập: tìm một phần tử9Lát cắt chuỗi và hơn thế nữa
String và &strTạo lát cắt chuỗiLát cắt làm tham số hàmCác lát cắt khácÔn tập: Tìm từ đầu tiênTự luyện tập: Trình biên dịch Rust online