rust - 我可以在与 gen_range 的模式匹配中避免 `_` 吗?

标签 rust

如果我想匹配 rand::thread_rng().get_range(1, 3) 的结果,我需要添加一个_ 值,即使知道只有两个可能的值:

match rand::thread_rng().gen_range(1, 3) {
    1 => println!("1"),
    2 => println!("2"),
    _ => panic!("never happens")
};

_ 大小写无用但必需。

我知道编译器无法猜测 gen_range(1, 3) 只能返回 1 或 2 但有没有办法避免添加这个无用的行 _ => panic! ("never happens") 使用模式匹配(可能对编译器有一些提示)?或者我是否需要将最后一个值 (2) 替换为 _

最佳答案

I understand the compiler can't guess that gen_range(1, 3) can only return 1 or 2

没错。 gen_range 在这种情况下返回一个 i32,一个 i32 可能有更多的值。

is there a way to avoid adding this useless line _ => panic!("never happens")

正如评论中所述,unreachable!比普通的 panic! 更能表达您的意图:

match rand::thread_rng().gen_range(1, 3) {
    1 => println!("1"),
    2 => println!("2"),
    _ => unreachable!(),
};

replace the last value (2) by _?

这很好,但是当您最终更改参数时的“失败”情况可能更难捕捉:

match rand::thread_rng().gen_range(1, 100) {
    1 => println!("1"),
    _ => println!("2"), // oops!
};

出现panic的版本在测试的时候更容易出现明显的炸毁。您选择哪种取决于您和您的风险承受能力。

The only "bullet proof" alternative is to use an enum { One, Two }, but it leads to more boilerplate and just forces the range check to be done slightly sooner

这行得通,如果您想在代码中多次使用 match 的等价物,这会很有用。这将逻辑整合到一个位置。

我有点惊讶没有一个宏 1.1 crate 允许像 #[derive(Rand)] 这样的东西用于枚举...但是有一些 crate 似乎使更容易。

这种特定情况下,您还可以生成一个随机 bool 值并只选择12:

if rand::thread_rng().gen() {
    println!("1")
} else {
    println!("2")
}

关于rust - 我可以在与 gen_range 的模式匹配中避免 `_` 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44025929/

相关文章:

unit-testing - 如何在 Rust 中注释空切片的类型?

rust - 如何在方法实现中从枚举中的字符串返回 &str?

rust - 如何修复 Encodable/Decodable 弃用问题?

rust - 如何从 `File`推广到 `Read`?

rust - 为什么 Rust 堆栈框架如此之大?

rust - panic 和 process::exit 有什么区别

rust - 如何解构/移出 Drop 实现类型?

rust - `#![feature(no_core)]` 和 `#![no_core]` 有什么区别?

rust - 闭包类型不匹配

rust - 如何使用Diesel连接和Gtk-rs事件?