是否可以在 Rust 中的嵌套Vec 上进行模式匹配?

问题描述

一个库为我提供了一个深度嵌套的数据结构,我想与之匹配。它在内部包含 Vec。我想要像注释掉的行之一那样工作:

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,// expected struct `Vec`,found reference
    // Foo{bar:vec![true,// 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 在标准库中,而不是语言的一部分,但我仍然希望有一些模式匹配魔法可以解决这个问题。

解决方法

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

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

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