如果我想得到matcha的结果rand::thread_rng().get_range(1, 3),我需要添加一个_值,即使我知道只有两个可能的值:
match rand::thread_rng().gen_range(1, 3) {
1 => println!("1"),
2 => println!("2"),
_ => panic!("never happens")
};
Run Code Online (Sandbox Code Playgroud)
该_案件是无用的,但需要.
我理解编译器不能猜测gen_range(1, 3)只能返回1或2,但有没有办法避免添加这个无用的行_ => panic!("never happens")与模式匹配(可能有一些提示编译器)?或者我需要替换最后一个值(2)_吗?
我理解编译器无法猜测
gen_range(1, 3)只能返回1或2
那是正确的.在这种情况下gen_range返回一个i32,并且i32可能有更多的值.
有没有办法避免添加这个无用的线
_ => panic!("never happens")
正如评论中所述,unreachable!更好地表达您的意图而不仅仅是简单的panic!:
match rand::thread_rng().gen_range(1, 3) {
1 => println!("1"),
2 => println!("2"),
_ => unreachable!(),
};
Run Code Online (Sandbox Code Playgroud)
替换最后一个值(
2)_?
这样会很好,但是当你最终更改参数时"失败"的情况可能更难以捕获:
match rand::thread_rng().gen_range(1, 100) {
1 => println!("1"),
_ => println!("2"), // oops!
};
Run Code Online (Sandbox Code Playgroud)
在测试期间,恐慌的版本更容易爆炸.您选择哪个取决于您和您的风险承受能力.
唯一的"防弹"替代方案是使用
enum { One, Two },但它会导致更多的样板,并且只是稍微强制进行范围检查
这可以工作,如果你想match在代码中多次使用它,那将非常有用.这将逻辑合并到一个位置.
我有点惊讶的是,没有一个宏的1.1箱子允许像#[derive(Rand)]枚举这样的东西......但有一些箱子似乎让它更容易.
在这种特定情况下,您还可以生成随机布尔值,只需选择1或2:
if rand::thread_rng().gen() {
println!("1")
} else {
println!("2")
}
Run Code Online (Sandbox Code Playgroud)