首页 > 解决方案 > 是否可以在 Rust 中的(嵌套)Vec 上进行模式匹配?

问题描述

一个库为我提供了一个我想匹配的深度嵌套的数据结构。它在内部包含Vecs。我想要像注释掉的行之一这样的东西:

struct Foo {
    bar: Vec<bool>,
}

let foo = Foo {
    bar: vec![true, false],
};

match foo {
    // Foo{bar:[true,false]} => Ok(()), // expected an array or slice, found Vec<bool>
    // Foo{bar:&[true, false]} => Ok(()), // expected struct `Vec`, found reference
    // Foo{bar:vec![true,false]} => Ok(()), // Arbitrary expressions aren't allowed in patterns
    Foo { bar: v } => match v.as_slice() {
        [true, false] => Ok(()),
        _ => bail!("match failed!"),
    }, // Ugly when nesting deeply
    _ => bail!("match failed!"),
}

match 语句可以分成更小的部分,首先对匹配的值进行一些解引用/解包,首先将其转换为切片。我目前正在我的代码中执行此操作,但它非常难看,并且模糊了被解构事物的结构。

问题在于Vec标准库中,而不是语言的一部分,但我仍然希望有一些模式匹配魔法可以解决这个问题。

标签: vectorrustpattern-matching

解决方案


不,目前不支持模式匹配 vecs(更不用说就地)。目前,Rust 仅支持有限的切片模式形式,即使是最近的(1.42)。

您可以使用其他一些 Rust 工具来使代码稍微简洁一些,但仅此而已,例如if letmatches!

    match foo {
        Foo { bar: v } if matches!(v.as_slice(), [true, false]) => Ok(()),
        _ => bail!("match failed!"),
    }

推荐阅读