rust - 当变量从不重新分配时,为什么我需要使用 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
变量可变呢?
解决方案
有两种情况需要将变量声明为可变:
- 当您通过赋值更改它的值时(您可能已经理解了这一点):
let mut my_var = 5i32;
println!("old value {}", my_var);
my_var = my_var * 2;
println!("old value {}", my_var);
- 当您获得对它的可变引用时:
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
.
推荐阅读
- python - 在 __geo_interface__ geopandas choropleth 地图出现错误,有人知道吗?
- python-3.x - 使用 SQLAlchemy 和 fastAPI 连接到数据库时出错
- r - 在ggplot2中创建上/下abline点的数据表
- python - 从另一个 python 脚本导入类
- linux - 如何在linux内核中测试地址是虚拟的还是逻辑的?
- arrays - 如何使用 jq 创建 json 对象数组并在 bash 中设置为 var
- c# - Automapper - 访问 MapFrom 中的默认地图功能以回退
- python - JSONResponse 中未解决的参考“内容”
- visual-studio-code - 通过 VS Code launch.json 使用 Node js Mocha 运行单个测试文件
- wordpress - Woocommerce - 特定产品为物理商店送货地址添加免费送货