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在标准库中,而不是语言的一部分,但我仍然希望有一些模式匹配魔法可以解决这个问题。
不,当前不支持模式匹配 vec(更不用说就地匹配)。目前,Rust 仅支持某种有限形式的切片模式,即使这是相当新的(1.42)。
您可以使用其他一些 Rust 工具来使代码稍微简洁一些,但仅此而已,例如if let或matches!
match foo {
Foo { bar: v } if matches!(v.as_slice(), [true, false]) => Ok(()),
_ => bail!("match failed!"),
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2181 次 |
| 最近记录: |