是否可以在 Rust 中的(嵌套)Vec 上进行模式匹配?
Is it possible to pattern match on a (nested) Vec in 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!"),
}
匹配语句可以分成更小的部分,首先对匹配的值做一些dereferencing/unpacking,先把它变成一个切片。我目前正在我的代码中这样做,但它非常丑陋,并且模糊了被解构的东西的结构。
问题是 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!"),
}
一个库向我提供了一个我想要匹配的深层嵌套数据结构。它内部包含 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!"),
}
匹配语句可以分成更小的部分,首先对匹配的值做一些dereferencing/unpacking,先把它变成一个切片。我目前正在我的代码中这样做,但它非常丑陋,并且模糊了被解构的东西的结构。
问题是 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!"),
}