Руст совпадение неожиданных результатов
Почему этот код дает мне странные результаты?
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
1 ответ
Если вы не используете 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
четыре константы находятся в области видимости, и вы можете сравнивать их.