如果我想匹配
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 值并只选择1
或2
:
if rand::thread_rng().gen() {
println!("1")
} else {
println!("2")
}
关于rust - 我可以在与 gen_range 的模式匹配中避免 `_` 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44025929/