为什么这段代码会给我带来奇怪的结果?
const VAR1: u16 = 1;
const VAR2: u16 = 2;
const VAR3: u16 = 3;
const VAR4: u16 = 4;
#[cfg(test)]
mod tests {
// use {VAR1, VAR2, VAR3, VAR4};
#[test]
fn test_match() {
let a = 4;
match a {
VAR1 => {
println!("matched: 1");
}
VAR2 => {
println!("matched: 2");
}
VAR3 => {
println!("matched: 3");
}
VAR4 => {
println!("matched: 4");
}
_ => {
println!("not matched");
}
}
}
}
当注释行// use {VAR1, VAR2, VAR3, VAR4};
时,测试执行的结果为matched: 1
。如果未对use {VAR1, VAR2, VAR3, VAR4};
进行评论,则结果正确且为matched: 4
。
为什么编译器在第一种情况下没有失败?
cargo test -- --nocapture
rustc --version
rustc 1.16.0-nightly (7e38a89a7 2017-01-06)
您可以在此处找到测试项目代码https://github.com/asmsoft/rust-match-test
答案 0 :(得分:5)
如果您不使用VAR1
,VAR2
,VAR3
,VAR4
,则它们不在匹配范围内,并且该模式将成为绑定。其余模式无法访问,您会收到以下警告:
--> src/main.rs:28:13
|
28 | VAR4 => {
| ^^^^
|
= note: #[warn(unused_variables)] on by default
warning: unreachable pattern
如果您用以下内容替换了打印件:
match a {
VAR1 => {
println!("matched: 1 ({:?})", VAR1);
}
}
由于VAR1现在具有与之匹配的值,因此将打印
matched: 1 (4)
使用use
,四个常量在范围内,您可以匹配它们。