这味道很难闻:
let millis = time % 1000;
match millis {
0..=199 => do_something(),
200..=599 => do_something_else(),
600..=999 => do_something_altogether_different(),
_ => panic!("There are only 1,000 ms in a second."),
}
Run Code Online (Sandbox Code Playgroud)
“_”的情况永远不会被调用,就像millis一样time % 1000。
我怎样才能重写这个以便我只有三个分支?
理想情况下,我还想删除重复的 199/200、599/600 和 999/1000/0。
如果最好的解决方案不是,match我很乐意使用其他一些控制结构。
Net*_*ave 16
Rust 使用类型进行匹配,因此它不知道您的逻辑的边界。但你做了。
\n为了明确你可以使用unreachable!:
\n\n表示无法访问的代码。
\n当编译器无法确定某些代码无法访问时,这非常有用。例如:
\n将武器与守卫条件相匹配。动态终止的循环。\n动态终止的迭代器。如果代码不可访问的判断被证明是错误的,则程序会立即终止并出现紧急情况!。
\n
let millis = time % 1000;\nmatch millis {\n 0..=199 => do_something(),\n 200..=599 => do_something_else(),\n 600..=999 => do_something_altogether_different(),\n _ => unreachable!("There are only 1,000 ms in a second."),\n}\nRun Code Online (Sandbox Code Playgroud)\n否则,您可以认为最后一个分支是默认分支:
\nlet millis = time % 1000;\nmatch millis {\n 0..=199 => do_something(),\n 200..=599 => do_something_else(),\n _ => do_something_altogether_different(),\n}\nRun Code Online (Sandbox Code Playgroud)\n
小智 9
我会使用简单的,if因为每种情况都有一个条件,而且只有少量情况:
if millis < 200 {
do_something()
} else if millis < 600 {
do_something_else()
} else {
do_something_altogether_different()
}
Run Code Online (Sandbox Code Playgroud)
如果你想使用match你也可以if在其中使用 -guards :
match millis {
x if x < 200 => do_something(),
x if x < 600 => do_something_else(),
_ => do_something_altogether_different(),
}
Run Code Online (Sandbox Code Playgroud)
两者都删除了重复的199/ 200...
这只是 Kevin Reid 答案的改进,它通过颠倒顺序来消除重复:
let millis: u64 = time % 1000;
match millis {
600.. => todo!(),
200.. => todo!(),
0.. => todo!(),
}
Run Code Online (Sandbox Code Playgroud)
我们也可以再省略一个数字,但我不确定这是否是一种改进。
let millis: u64 = time % 1000;
match millis {
600.. => todo!(),
200.. => todo!(),
_ => todo!(),
}
Run Code Online (Sandbox Code Playgroud)