[英]How to do complex pattern matching of enums mixed with structs
目前,給定一個A
,如果我想在它包含一個帶有 true 的D
時返回true
,我必須執行以下操作:
pub enum A{
B(B),
C(C)
}
pub struct B{
b1: D,
b2: bool
}
pub struct C{}
pub struct D{
d1: E
}
pub struct E{
e1: bool
}
fn main() {
let something = A::B(B{b1: D{d1: E{e1: true}}, b2: false});
let e1_result = if let A::B(B{b1, b2}) = something {
if let D{d1} = b1 {
if let E{e1} = d1 {
e1
} else {
false
}
} else {
false
}
} else {
false
};
}
有沒有一種干凈的方法來匹配d_1
? 如果某個時間是盒裝的怎么辦? 示例: pub struct D{ d_1: Box<E>}
您可以嵌套模式:
let e1_result = if let A::B(B {
b1: D { d1: E { e1: true } },
..
}) = something
{
true
} else {
false
};
此時你可以只使用matches!()
:
let e1_result = matches!(something, A::B(B { b1: D { d1: E { e1: true } }, .. }));
但是,如果您在中間有Box
,那么您就不走運了。 您可以使用不穩定的功能box_patterns
,但我不建議這樣做:它不太可能穩定(而是某種形式的deref patterns ,但這尚未實現)。 Yoy必須分離模式。
作為旁注,當你的代碼中有一個無可辯駁的模式(一種不會失敗的模式),比如D
和E
,你可以只使用let
,不需要if let
。 此外,您可以使用..
或_
忽略未使用的字段。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.