首页 > 解决方案 > 当变量从不重新分配时,为什么我需要使用 mut ?

问题描述

我以为我理解了何时以及为什么需要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 }
}

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

标签: rust

解决方案


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

  1. 当您通过赋值更改它的值时(您可能已经理解了这一点):
let mut my_var = 5i32;
println!("old value {}", my_var);
my_var = my_var * 2;
println!("old value {}", my_var);
  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);

在上面的代码中会非常令人惊讶,因为如果我们声明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);

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


推荐阅读