問題一覧に戻る
中級エラー処理
問題55: ?演算子
?演算子はResultやOptionのエラー伝播を簡潔にします。失敗時は早期リターン、成功時は値を取り出します。複数の可能なエラーを連鎖的に扱う際に便利で、コードが読みやすくなります。関数の返り値はResultまたはOptionである必要があります。エラー型の変換にはmap_errを使います。
use std::fs;
use std::io;
// ?演算子を使った関数
fn read_number_from_file(path: &str) -> Result<i32, io::Error> {
let content = fs::read_to_string(path);
let number = content.trim().parse()
.map_err(|_| io::Error::new(io::ErrorKind::InvalidData, "Invalid number"));
Ok(number)
}
// 連鎖的な操作
fn process_file(path: &str) -> <String, io::Error> {
let content = fs::read_to_string(path);
let processed = content.trim().to_uppercase();
(processed)
}
fn main() -> Result<(), io::Error> {
let result = process_file("data.txt");
println!("Processed: {}", result);
Ok(())
}