为什么 Rust 说我的变量未使用?

lol*_*ter 8 rust

这是一个Rust 游乐场链接,但是:

fn main() {
    // marking var as mutable
    let mut counter = 0;
    counter += 1;
    counter += 3;
    println!("counter: {}", counter);

    // "shadowing" a variable: this is allocating mem for new var, 
    // and replacing the old one after
    let myvar = 5;
    let myvar = 1000;
    println!("myvar: {}", myvar);
}
Run Code Online (Sandbox Code Playgroud)

这给出了警告:

warning: unused variable: `myvar`
  --> src/main.rs:19:9
   |
19 |     let myvar = 5;
   |         ^^^^^ help: if this is intentional, prefix it with an underscore: `_myvar`
   |
   = note: `#[warn(unused_variables)]` on by default

warning: 1 warning emitted
Run Code Online (Sandbox Code Playgroud)

我不太明白。我稍后在println宏中使用它。为什么说没用呢?

也许我还不太了解阴影:我认为它有效地为新变量分配空间,在那里写入新值,然后使符号myvar指向该内存。

orl*_*rlp 14

隐藏变量会使前一个变量无法访问,但不会“覆盖”它或类似的变量。

因此,您的原始定义let myvar = 5;仍然存在,只是在您的第二个定义之后不再可访问myvar。然而,原始文件仍然被编译器跟踪,它理所当然地抱怨你从不使用它。

  • 为了澄清“不可访问”的含义,标识符“myvar”不会引用第一个变量,因为它被隐藏了,但它的*值*仍然可以通过其他方式(例如通过引用)访问。请参阅[操场上的这个示例](https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=aa1b0de6ab9095386266f9d2624436d1)。 (3认同)

Kon*_*lph 9

我稍后在println宏中使用它。

不,你没有。您正在使用变量myvar,该变量隐藏了同名的前一个变量。这就是编译器正确抱怨的原因。

要解决此问题,请删除不必要的let myvar = 5;声明。