rust 在模式匹配期间将变量绑定到枚举变量

kx7yvsdv  于 2022-12-29  发布在  其他
关注(0)|答案(1)|浏览(142)

我该怎么做呢?

enum A {
    A1(B)
}

enum B {
    B1 {
        num: u64,
    }
}

fn main() {
    let a = A::A1(B::B1 { num: 123 });
    match a {
        A::A1(b @ B::B1 { .. }) => {
            println!("{}", b.num); // <-- no field `num` on type `B`
        }
    }
}

也就是说,我们的目标是将内部的B::B1变量绑定到一个变量,然后访问该匹配的字段,但是这个变量消失了,绑定的b变量又变成了一个无意义的泛型枚举。
我知道如果我手动地解构所有的B::B1的内部字段,我可以访问它们,但是这有点不方便。有没有一种方法可以以某种方式“记住”内部枚举变体?

wa7juj8i

wa7juj8i1#

问题是B::B1不是一个类型,而是一个
b本身的类型为B,并且B没有.num成员。
要从枚举中获取值,必须直接对其进行解构,如下所示:

enum A {
    A1(B),
}

enum B {
    B1 { num: u64 },
}

fn main() {
    let a = A::A1(B::B1 { num: 123 });
    match a {
        A::A1(B::B1 { num }) => {
            println!("{}", num);
        }
    }
}
123

这里的用例并不少见,通常通过嵌套结构来解决,如serde_json::Value中所示:
一个二个一个一个

相关问题