问题描述
一个库为我提供了一个深度嵌套的数据结构,我想与之匹配。它在内部包含 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 let
或 matches!
match foo {
Foo { bar: v } if matches!(v.as_slice(),[true,false]) => Ok(()),_ => bail!("match failed!"),}