簡體   English   中英

如何對與結構混合的枚舉進行復雜的模式匹配

[英]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必須分離模式。

作為旁注,當你的代碼中有一個無可辯駁的模式(一種不會失敗的模式),比如DE ,你可以只使用let ,不需要if let 此外,您可以使用.._忽略未使用的字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM