#macro #nested #pattern #let #expressions

无 std if_chain

编写嵌套 if let 表达式的宏

7 个版本 (3 个稳定版)

使用旧的 Rust 2015

1.0.2 2021 年 8 月 21 日
1.0.1 2020 年 9 月 29 日
1.0.0 2019 年 5 月 22 日
0.1.3 2018 年 7 月 20 日
0.1.1 2016 年 12 月 29 日

55Rust 模式

Download history 174326/week @ 2024-03-14 173752/week @ 2024-03-21 193871/week @ 2024-03-28 173972/week @ 2024-04-04 193104/week @ 2024-04-11 190635/week @ 2024-04-18 180836/week @ 2024-04-25 203740/week @ 2024-05-02 194398/week @ 2024-05-09 219143/week @ 2024-05-16 220479/week @ 2024-05-23 225796/week @ 2024-05-30 216952/week @ 2024-06-06 222426/week @ 2024-06-13 207996/week @ 2024-06-20 191743/week @ 2024-06-27

每月 889,094 次下载
809 包(65 个直接)中使用

MIT/Apache

10KB
139

if_chain

Build Status Cargo

此包提供了一个名为 if_chain! 的单个宏。

if_chain! 允许您编写长链嵌套的 ifif let 语句,而不会出现相关的向右偏移。它还支持多个模式(例如,if let Foo(a) | Bar(a) = b),在 Rust 通常不允许这些模式的地方。

有关此包的更多信息,请参阅文档和相关的博客文章


lib.rs:

此包提供了一个名为 if_chain! 的单个宏。

if_chain! 允许您编写长链嵌套的 ifif let 语句,而不会出现相关的向右偏移。它还支持多个模式(例如,if let Foo(a) | Bar(a) = b),在 Rust 通常不允许这些模式的地方。

有关此包的背景信息,请参阅相关的博客文章

递归限制的说明

如果您在使用此宏时遇到“递归限制已达到”的错误,请尝试将以下内容添加到您的包顶部:

#![recursion_limit = "1000"]

示例

快速入门

if_chain! {
    if let Some(y) = x;
    if y.len() == 2;
    if let Some(z) = y;
    then {
        do_stuff_with(z);
    }
}

变为

if let Some(y) = x {
    if y.len() == 2 {
        if let Some(z) = y {
            do_stuff_with(z);
        }
    }
}

使用 else 添加回退值

if_chain! {
    if let Some(y) = x;
    if let Some(z) = y;
    then {
        do_stuff_with(z)
    } else {
        do_something_else()
    }
}

变为

if let Some(y) = x {
    if let Some(z) = y {
        do_stuff_with(z)
    } else {
        do_something_else()
    }
} else {
    do_something_else()
}

使用 let 添加中间变量

if_chain! {
    if let Some(y) = x;
    let z = y.some().complicated().expression();
    if z == 42;
    then {
       do_stuff_with(y);
    }
}

变为

if let Some(y) = x {
    let z = y.some().complicated().expression();
    if z == 42 {
        do_stuff_with(y);
    }
}

类型注解

let mut x = some_generic_computation();
if_chain! {
    if x > 7;
    let y: u32 = another_generic_computation();
    then { x += y }
    else { x += 1 }
}

变为

let mut x = some_generic_computation();
if x > 7 {
    let y: u32 = another_generic_computation();
    x += y
} else {
    x += 1
}

多个模式

if_chain! {
    if let Foo(y) | Bar(y) | Baz(y) = x;
    let Bubbles(z) | Buttercup(z) | Blossom(z) = y;
    then { do_stuff_with(z) }
}

变为

match x {
    Foo(y) | Bar(y) | Baz(y) => match y {
        Bubbles(z) | Buttercup(z) | Blossom(z) => do_stuff_with(z)
    },
    _ => {}
}

请注意,如果您使用的是普通 let,则 if_chain! 假设该模式是 不可反驳的(总是匹配),并且不会添加回退分支。

无运行时依赖