デフォルト値の提供:unwrap_or
CoddyのRustジャーニー「Logic & Flow」セクションの一部 — レッスン 40/66。
.unwrap() や .expect() は Option から値を取り出すことができますが、これらには両方とも大きな欠点があります。それは、None に遭遇したときにパニックを引き起こすことです。より安全なコードのために、Rustは .unwrap_or() を提供しています。これは決してパニックを起こさないメソッドです。
.unwrap_or()メソッドは、引数としてデフォルト値を受け取ります。OptionがSomeを含んでいる場合、その中の値を返します。それがNoneである場合、指定したデフォルト値を返します:
let maybe_score = Some(85);
let score = maybe_score.unwrap_or(0);
println!("Score: {}", score); // 出力: Score: 85
let no_score: Option = None;
let default_score = no_score.unwrap_or(0);
println!("Score: {}", default_score); // 出力: Score: 0このアプローチは、.unwrap() よりもはるかに安全です。プログラムがクラッシュすることはなく、常に利用可能な値が返されるからです。
チャレンジ
簡単2つの入力を受け取ります。最初の入力はスコア(数値)で、2番目の入力はそのスコアが利用可能か(yes)、または欠落しているか(no)を示します。利用状況に基づいて Option<i32> を作成してください。.unwrap_or() を使用して、デフォルト値を 50 としたスコアを安全に取り出し、最終的なスコアを出力してください。
要件:
- 最初の入力(スコア)を読み取り、空白をトリミングする
- 最初の入力を
i32にパースする - 2番目の入力(利用状況)を読み取り、空白をトリミングする
Option<i32>変数を作成する:- 利用状況が
yesの場合、Some(score)を割り当てる - 利用状況が
noの場合、Noneを割り当てる
- 利用状況が
.unwrap_or(50)を使用して、デフォルト値を50としたスコアを取り出す- 最終的なスコアを
Final score: [score]の形式で出力する
入力:
- 1行目:スコアを表す数値(例:
85) - 2行目:
yesまたはno
出力:
- 利用状況が
yesの場合:Final score: [score](実際のスコア) - 利用状況が
noの場合:Final score: 50(デフォルト値)
チートシート
.unwrap_or() メソッドは、パニックを起こさずに Option から値を取り出す安全な方法を提供します。このメソッドは引数としてデフォルト値を受け取り、Some の場合はその内部の値を、None の場合はデフォルト値を返します。
let maybe_score = Some(85);
let score = maybe_score.unwrap_or(0);
// score は 85
let no_score: Option<i32> = None;
let default_score = no_score.unwrap_or(0);
// default_score は 0このメソッドは、パニックを引き起こすことがないため、.unwrap() や .expect() よりも安全です。常に利用可能な値を受け取ることができます。
自分で試してみよう
use std::io;
fn main() {
// スコアを読み込む
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");
// 利用可能ステータスを読み込む
let mut availability = String::new();
io::stdin().read_line(&mut availability).expect("Failed to read line");
let availability = availability.trim();
// TODO: 以下にコードを記述してください
// 利用可能ステータスに基づいて Option<i32> を作成します
// .unwrap_or(50) を使用して最終スコアを取得します
// 結果を出力する
println!("Final score: {}", final_score);
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Logic & Flowのすべてのレッスン
6Optionによる値の欠如の扱い
Optionとは?Optionでmatchを使うis_some() と is_none()Optionのアンラップexpect メソッドデフォルト値の提供:unwrap_orまとめ:要素の検索