0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

(DAY21) 俺と学ぶRust言語~if let~

Posted at

今日の内容

  • if letの使い方

はじめに

前回はOptionとResultを組み合わせたエラーハンドリングの応用について学びました。今回は if let について学びます。

if let

if letは今までの記事で何回かでてきましたが、明確に触れたことはありませんでした。
今日しっかりと学んで、使えるようになりましょう。

if letは、Rustでパターンマッチングを簡潔に書ける便利な構文です。特に、OptionやResultなどの列挙型の値を扱うときに使われます。match構文よりもコードがシンプルで読みやすくなる場面に適しています。

ここで、条件分岐の「if」と変数定義の「let」を使っているわけではないことに注意してください。「if」と「let」と『if let』は全くの別物です。

基本構文

if let パターン =  {
    //パターンにマッチした際の処理
}
  • 式: マッチング対象となる値(例えばOptionやResultなど)
  • パターン: 取り出したい値や条件を記述

基本例: Optionでの記述

matchで書いた場合

let some_value = Some(42);

match some_value {
    Some(x) => println!("Value: {}", x),
    None => println!("No value"),
}

if letで書いた場合

let some_value = Some(42);

if let Some(x) = some_value {
    println!("Value: {}", x);
} else {
    println!("No value");
}
  • if letを使うと、特定のパターンにだけ注目して簡潔に書ける
  • 必要ならelseブロックで、マッチしなかった場合の処理も書ける

Resultを使った例

let result: Result<i32, &str> = Ok(10);

if let Ok(value) = result {
    println!("Success! Value: {}", value);
} else {
    println!("Error");
}
  • Ok(value) の場合に値を取り出し、Errの場合はelseで処理

if letの利点

  1. コードが簡潔になる
    • 特定のケースだけを処理したい場合に有効
    • matchのように全てのケースを網羅する必要がない
  2. 可読性の向上
    • ネストが浅くなるため、可読性が上がる

応用例: ネストした構造体や列挙型

ネストされたOption

let nested = Some(Some(5));

if let Some(Some(x)) = nested {
    println!("Nested value: {}", x);
} else {
    println!("No value");
}

if letとmatchの使い分け

  • if letを使うべきケース
    • 特定のパターンだけに注目したい時
    • 他のケースは無視して良いとき
  • matchを使うべきケース
    • 全てのケースを網羅して処理したい時
    • より複雑なパターンを扱う場合

実践例: ファイルの読み込み

以下のプログラムでは、「example.txt」という名前のファイルを開けたかどうかを示します。開くことができれば、そのファイルの中身を表示します。

use std::{fs::File, io::Read};
fn main() {
    let file_result = File::open("example.txt");

    if let Ok(mut file) = file_result {
        let mut content = String::new();
        file.read_to_string(&mut content).unwrap();
        println!("File contents:\n{}", content);
    } else {
        println!("Can't open!");
    }
}

プロジェクトファイル内に「example.txt」を用意して、中身を次のようにしました。
スクリーンショット 2025-01-14 224544.png

実行結果

File contents:
Hello, world!

This is a pen.
これは、ペンです。

おわりに

今回はif letについて学びました。
次回はコマンドライン引数の扱い方を学びます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?