Fra*_*em. 2 for-loop mutable rust borrowing
我试图在使用Vec<f64>Vec内部制作的矩阵上做一个循环,然后逐个改变它的元素.
我似乎无法使其发挥作用; 我对语法仍然太困惑了......
extern crate rand;
use std::ptr;
use std::mem;
use rand::Rng;
fn main() {
let mut rng = rand::thread_rng();
let mut v: Vec<Vec<f64>> = Vec::new();
v.push(vec![0f64; 35]);
v.push(vec![0f64; 35]);
v.push(vec![0f64; 35]);
v.push(vec![0f64; 35]);
let len = v.len();
for &el in &v {
for q in &mut el {
q = rng.gen::<f64>();
println!("{}", q);
}
println!("{:?}", el);
}
println!("float: {}", rng.gen::<f64>());
//println!("vec: {:?}, len: {}",v,len);
}
Run Code Online (Sandbox Code Playgroud)
编译器说:
error[E0308]: mismatched types
--> src/main.rs:19:17
|
19 | q = rng.gen::<f64>();
| ^^^^^^^^^^^^^^^^ expected &mut f64, found f64
|
= note: expected type `&mut f64`
found type `f64`
= help: try with `&mut rng.gen::<f64>()`
Run Code Online (Sandbox Code Playgroud)
我尝试遵循编译器提示,各种组合mut &和.iter()或.iter_mut(),但没有一个工作.经过一番挫折之后,我注意到我对搜索解决方案的搜索已成为蒙特卡罗算法.
阅读错误消息 - 它们是静态类型语言的巨大好处,但它确实需要您实际查看它们.
--> src/main.rs:19:17
|
19 | q = rng.gen::<f64>();
| ^^^^^^^^^^^^^^^^ expected &mut f64, found f64
|
= note: expected type `&mut f64`
found type `f64`
= help: try with `&mut rng.gen::<f64>()`
Run Code Online (Sandbox Code Playgroud)
不幸的是,这里的"帮助"不是正确的路径,但它只是来自编译器的猜测.
您正在尝试创建类型的随机值,f64并将其分配给包含a的变量&mut f64.这些是不同的类型,因此您会收到错误.
您需要取消引用要存储的变量:
extern crate rand;
use rand::Rng;
fn main() {
let mut rng = rand::thread_rng();
let mut v = vec![
vec![0f64; 35],
vec![0f64; 35],
vec![0f64; 35],
vec![0f64; 35],
];
for el in &mut v {
for q in el {
*q = rng.gen::<f64>();
}
}
println!("vec: {:?}", v);
}
Run Code Online (Sandbox Code Playgroud)
我可能不会零初始化任何东西,并将其写为
let mut rng = rand::thread_rng();
let v: Vec<Vec<f64>> = (0..4)
.map(|_| (0..35).map(|_| rng.gen()).collect())
.collect();
println!("vec: {:?}", v);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
116 次 |
| 最近记录: |