let-else

๐Ÿ›ˆ Rust 1.65ใงๅฎ‰ๅฎšๅŒ–ใ€‚

๐Ÿ›ˆ ใ‚จใƒ‡ใ‚ฃใ‚ทใƒงใƒณใ‚’ๆŒ‡ๅฎšใ™ใ‚‹ใซใฏrustc --edition=2021 main.rsใฎใ‚ˆใ†ใซใ—ใพใ™ใ€‚

let-elseใ‚’ไฝฟใ†ใจๅ้งใงใใ‚‹ใƒ‘ใ‚ฟใƒผใƒณใซใƒžใƒƒใƒใ•ใ›ใคใคใ€้€šๅธธใฎletใฎใ‚ˆใ†ใซๅค‰ๆ•ฐๆŸ็ธ›ใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ใƒžใƒƒใƒใ—ใชใ‹ใฃใŸๅ ดๅˆใฏ๏ผˆbreakใ€returnใ€panic!ใฎใ‚ˆใ†ใซ๏ผ‰ๅ‡ฆ็†ใ‚’ๅˆ†ๅฒใ•ใ›ใพใ™ใ€‚

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"));
}

ๆŸ็ธ›ใ—ใŸๅค‰ๆ•ฐๅใฎใ‚นใ‚ณใƒผใƒ—ใŒmatchใ‚„if let-elseๅผใจใฎไธปใช้•ใ„ใงใ™ใ€‚matchใ‚„if 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"));
}

ๅ‚็…ง

Option, match, if let, let-else RFC.