Rust匹配意外的结果

Ale*_*nko 0 rust rust-cargo

为什么这段代码会给我带来奇怪的结果?

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");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

// 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找到测试项目代码

小智 5

如果你不使用VAR1,VAR2,VAR3,VAR4,他们不是在比赛的范围和模式成为一个具有约束力.其余模式无法访问,您会收到以下警告:

  --> src/main.rs:28:13
   |
28 |             VAR4 => {
   |             ^^^^
   |
   = note: #[warn(unused_variables)] on by default

warning: unreachable pattern
Run Code Online (Sandbox Code Playgroud)

如果您更换了您的打印件:

match a {
    VAR1 => {
        println!("matched: 1 ({:?})", VAR1);
    }
}
Run Code Online (Sandbox Code Playgroud)

由于VAR1现在具有与之匹配的值,因此将打印

matched: 1 (4)
Run Code Online (Sandbox Code Playgroud)

使用use,四个常量在范围内,您可以匹配它们.