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

And*_*ner 5 vector pattern-matching rust

一个库向我提供了一个我想要匹配的深度嵌套的数据结构。Vec它内部包含s 。我希望像注释掉的行之一一样起作用:

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!"),
}
Run Code Online (Sandbox Code Playgroud)

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

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

Mas*_*inn 7

不,当前不支持模式匹配 vec(更不用说就地匹配)。目前,Rust 仅支持某种有限形式的切片模式,即使这是相当新的(1.42)。

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

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

  • 感谢您提到“匹配!”。不确定我是否会在这里使用,但我确信我会找到使用它的地方。知道我可以投票的任何 RFC 吗?无法匹配核心 stdlib 类型(如“Vec”和“String”)确实会损害模式匹配。 (2认同)