gpt4 book ai didi

rust - 如何放宽对已知变体的嵌套匹配的非详尽模式检查?

转载 作者:行者123 更新时间:2023-11-29 08:12:01 27 4
gpt4 key购买 nike

我如何说服 Rust 编译器内部 match 表达式在这里没问题,因为外部 match 已经限制了可能的类型?

enum Op {
LoadX,
LoadY,
Add,
}

fn test(o: Op) {
match o {
Op::LoadX | Op::LoadY => {
// do something common with them for code reuse:
print!("Loading ");

// do something specific to each case:
match o {
// now I know that `o` can only be LoadX | LoadY,
// but how to persuade the compiler?
Op::LoadX => print!("x"), /* LoadX specific */
Op::LoadY => print!("y"), /* LoadY specific */
_ => panic!("shouldn't happen!"),
}

println!("...");
}

Op::Add => println!("Adding"),
}
}

fn main() {
test(Op::LoadX);
test(Op::LoadY);
test(Op::Add);
}

我尝试了两种方法,但似乎都不起作用。

  1. 为 or 模式命名,然后使用该名称进行匹配:

    match o {
    load@(Op::LoadX | Op::LoadY) => {
    // ...
    match load {
    // ...
    }
    }

    那不是有效的 Rust 语法。

  2. 命名并绑定(bind)每个构造函数:

    match o {
    load@Op::LoadX | load@Op::LoadY => {
    // ...
    match load {
    //...
    }
    }

    这仍然不满足详尽检查,因此出现相同的错误消息:

    error[E0004]: non-exhaustive patterns: `Add` not covered
    --> src/main.rs:14:19
    |
    14 | match load {
    | ^ pattern `Add` not covered

有什么惯用的方法可以解决这个问题,还是我应该把 panic!("shouldn't happen") 放在各处或重构代码?

Rust playground link

最佳答案

我认为你只需要重构你的代码,显然 LoadXLoadY 非常接近。所以我认为你应该创建第二个枚举来重新组合它们:

enum Op {
Load(State),
Add,
}

enum State {
X,
Y,
}

fn test(o: Op) {
match o {
Op::Load(state) => {
// do something common with them for code reuse
print!("Loading ");

// do something specific to each case:
match state {
State::X => print!("x"),
State::Y => print!("y"),
}

println!("...");
}

Op::Add => println!("Adding"),
}
}

fn main() {
test(Op::Load(State::X));
test(Op::Load(State::Y));
test(Op::Add);
}

这对我来说更有意义。我认为这是表达您想要的内容的更好方式。

关于rust - 如何放宽对已知变体的嵌套匹配的非详尽模式检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56049179/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com