#pattern #let #pattern-match #match #chain #if

iflet

提供了一个宏,用于在if let中链式调用多个模式,而不是嵌套它们

1个不稳定版本

使用旧的Rust 2015

0.1.0 2017年6月4日

#9 in #if


corollary中使用

Apache-2.0

9KB
253

crates.io Build Status

iflet - 避免嵌套if let的Rust宏

if let是Rust中一个非常棒的概念。您可以用它来代替模式匹配,以提高可读性,如下面的极端示例所示

fn div(num: i32, denom: i32) -> Option<i32> {
    if denom == 0 {
        return Some(num / denom);
    
    
    None
}

fn main() {
    if let Some(x) = div(6, 2) {
        assert_eq!(x, 3);
    }
}

但是,您不能使用 if let 来匹配多个子句或带有额外的 if guards (如 match 模式)。iflet 提供了一个宏,允许您做到这一点

#[macro_use]
extern crate iflet;
#[macro_use]
extern crate serde_json;

use serde_json::Value::{Object, Array};

fn main() {
    let value = json!({
        "numbers": [ 1, 2, 4, 9, 16, 25 ]
    });

    if_chain!([let Object(ref map) => value,
               let Some(&Array(ref vec)) if !vec.is_empty() => map.get("numbers")] {
        println!("there are {} numbers stored in the object", vec.len());
    } else {
        println!("there are no numbers stored in the object");
    });
}

无运行时依赖