Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

let-else

🛈 rust 1.65 以降で安定化

🛈 次のようにコンパイルすることで、特定のエディションを対象にできます rustc --edition=2021 main.rs

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 によって、これらのパターンを近似できました。

#![allow(unused)]
fn main() {
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"));
}

関連項目:

optionmatchif let、および let-else RFC