Let-Else を使った簡潔な Rust のパターンマッチング

Beginner

This tutorial is from open-source community. Access the source code

はじめに

この実験では、Rust における let-else の使用方法を示します。ここでは、検証可能なパターンが周囲のスコープ内の変数をマッチングして束縛することができ、そうでなければ、breakreturn、または panic! のような文を使用してパターンが一致しない場合には制御を抜けます。この構文は、パターンマッチングとエラーハンドリングのシナリオを扱う際に、コードブロックを繰り返す必要や外部の let 文を使用する必要をなくし、簡潔で読みやすいコードを可能にします。

注: 実験でファイル名が指定されていない場合、好きなファイル名を使用できます。たとえば、main.rs を使用して、rustc main.rs &&./main でコンパイルして実行することができます。

let-else

let-else を使用すると、検証可能なパターンは通常の let と同じように周囲のスコープ内の変数をマッチングして束縛することができ、そうでなければ、パターンが一致しない場合には制御を抜けます(たとえば、breakreturnpanic!)。

use std::str::FromStr;

fn get_count_item(s: &str) -> (u64, &str) {
    let mut it = s.split(' ');
    let (Some(count_str), Some(item)) = (it.next(), it.next()) else {
        panic!("Can't segment count item pair: '{s}'");
    };
    let Ok(count) = u64::from_str(count_str) else {
        panic!("Can't parse integer: '{count_str}'");
    };
    (count, item)
}

fn main() {
    assert_eq!(get_count_item("3 chairs"), (3, "chairs"));
}

名前の束縛のスコープが、これを matchif let-else 式と区別する主な点です。以前は、不運なことに繰り返しと外部の let を使ってこれらのパターンを近似することができました。

use std::str::FromStr;

fn get_count_item(s: &str) -> (u64, &str) {
    let mut it = s.split(' ');
    let (count_str, item) = match (it.next(), it.next()) {
        (Some(count_str), Some(item)) => (count_str, item),
        _ => panic!("Can't segment count item pair: '{s}'"),
    };
    let count = if let Ok(count) = u64::from_str(count_str) {
        count
    } else {
        panic!("Can't parse integer: '{count_str}'");
    };
        (count, item)
    }

    assert_eq!(get_count_item("3 chairs"), (3, "chairs"));

まとめ

おめでとうございます!あなたは Let-Else の実験を完了しました。あなたのスキルを向上させるために、LabEx でさらに多くの実験を行って練習してください。