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

rap*_*2-h 4 rust

如果我想得到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)_吗?

She*_*ter 6

我理解编译器无法猜测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)]枚举这样的东西......但有一些箱子似乎让它更容易.

这种特定情况下,您还可以生成随机布尔值,只需选择12:

if rand::thread_rng().gen() {
    println!("1")
} else {
    println!("2")
}
Run Code Online (Sandbox Code Playgroud)