try演算子
接続拒否やファイルが見つからないといった実行時エラーは Result 型で扱われます が、呼び出しのたびにこの型に対してパターンマッチを書くのは煩雑です。 エラーを呼び出し元に返すには、try演算子 ? を使います。これにより、 よくある次のようなコードを
// 著作権 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
match some_expression {
Ok(value) => value,
Err(err) => return Err(err),
}
はるかに単純な次の形にできます
// 著作権 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
some_expression?
これを使うと、エラー処理コードを簡潔にできます:
// 著作権 2023 Google LLC // SPDX-License-Identifier: Apache-2.0 use std::io::Read; use std::{fs, io}; fn read_username(path: &str) -> Result<String, io::Error> { let username_file_result = fs::File::open(path); let mut username_file = match username_file_result { Ok(file) => file, Err(err) => return Err(err), }; let mut username = String::new(); match username_file.read_to_string(&mut username) { Ok(_) => Ok(username), Err(err) => Err(err), } } fn main() { //fs::write("config.dat", "alice").unwrap(); let username = read_username("config.dat"); println!("username or error: {username:?}"); }
read_username 関数を、? を使うように簡略化してください。
ポイント:
username変数には、Ok(string)またはErr(error)のいずれかが入ります。fs::write呼び出しを使って、ファイルがない場合、空の ファイル、ユーザー名が入ったファイルといった各シナリオを試してください。- なお、
mainはstd::process::Terminationを実装している限りResult<(), E>を返せます。実際には、これはEがDebugを実装していることを 意味します。実行ファイルはErrバリアントを表示し、エラー時には 0 以外の終了 ステータスを返します。