Руст совпадение неожиданных результатов

Почему этот код дает мне странные результаты?

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четыре константы находятся в области видимости, и вы можете сравнивать их.

Другие вопросы по тегам