当变量从未重新分配时,为什么我需要使用 mut ?

tet*_*tet 2 rust

我以为我了解何时以及为什么需要mut在 Rust 代码中使用,但我不明白为什么需要mut在以下代码中使用。

use rand::{thread_rng, Rng};

fn main() {
    let mut rng = thread_rng(); // Why does this need to be mutable?
    println!("{:?}", rng); // outputs ThreadRng { rng: UnsafeCell }

    let x: u32 = rng.gen();
    println!("{}", x);

    println!("{:?}", rng); // outputs the same result as ThreadRng { rng: UnsafeCell }
}
Run Code Online (Sandbox Code Playgroud)

让我解释。变量rng被声明为可变的,但它的值在整个代码中永远不会改变,那么为什么我需要使rng变量可变呢?

Ang*_*ros 5

有两种情况需要将变量声明为可变:

  1. 当您通过赋值更改它的值时(您可能已经了解这一点):
let mut my_var = 5i32;
println!("old value {}", my_var);
my_var = my_var * 2;
println!("old value {}", my_var);
Run Code Online (Sandbox Code Playgroud)
  1. 当您获得对它的可变引用时:
let mut my_var = 5i32;
println!("old value {}", my_var);
let reference = &mut my_var;
*reference = 10; // Mutable reference allow us change the value
println!("old value {}", my_var);
Run Code Online (Sandbox Code Playgroud)

在上面的代码中会非常令人惊讶,因为如果我们声明my_var let my_var 因为它的实际值发生了变化。

你的情况正是如此。你调用这个方法:https : //docs.rs/rand/0.8.3/rand/trait.Rng.html#method.gen 你的代码可以改写为:

let x: u32 = Rng::gen(&mut rng);
Run Code Online (Sandbox Code Playgroud)

如您所见,通过调用使用&mut self.

  • @tet 但是 `Rng::gen` 确实改变了 `rng` 的值! (3认同)