Menu
Coddy logo textTech

デフォルト値の提供:unwrap_or

CoddyのRustジャーニー「Logic & Flow」セクションの一部 — レッスン 40/66。

.unwrap().expect()Option から値を取り出すことができますが、これらには両方とも大きな欠点があります。それは、None に遭遇したときにパニックを引き起こすことです。より安全なコードのために、Rustは .unwrap_or() を提供しています。これは決してパニックを起こさないメソッドです。

.unwrap_or()メソッドは、引数としてデフォルト値を受け取ります。OptionSomeを含んでいる場合、その中の値を返します。それが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() よりもはるかに安全です。プログラムがクラッシュすることはなく、常に利用可能な値が返されるからです。

challenge icon

チャレンジ

簡単

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);
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Logic & Flowのすべてのレッスン