如何修复这两个 for 循环以允许修改矢量内容?
How can I fix these two for loops to allow modification of the vector content?
我正在尝试对使用 Vec 中的 Vec<f64>
制作的矩阵进行循环,然后一个一个地改变它的元素。
我似乎无法让它工作;我仍然对语法感到困惑...
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);
}
编译器是这样说的:
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>()`
我尝试按照编译器提示,mut &
和 .iter()
或 .iter_mut()
的各种组合,但其中 none 有效。经过一番挫折后,我注意到我对解决方案的搜索已变成 Monte Carlo 算法。
阅读错误消息 — 它们是静态类型语言的巨大优势,但确实需要您实际 查看。
--> 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>()`
不幸的是,这里的 "help" 不是正确的路径,但这只是编译器的猜测。
您正在尝试创建类型为 f64
的随机值并将其分配给包含 &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);
}
我可能不会对任何东西进行零初始化,并将其写为
let mut rng = rand::thread_rng();
let v: Vec<Vec<f64>> = (0..4)
.map(|_| (0..35).map(|_| rng.gen()).collect())
.collect();
println!("vec: {:?}", v);
我正在尝试对使用 Vec 中的 Vec<f64>
制作的矩阵进行循环,然后一个一个地改变它的元素。
我似乎无法让它工作;我仍然对语法感到困惑...
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);
}
编译器是这样说的:
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>()`
我尝试按照编译器提示,mut &
和 .iter()
或 .iter_mut()
的各种组合,但其中 none 有效。经过一番挫折后,我注意到我对解决方案的搜索已变成 Monte Carlo 算法。
阅读错误消息 — 它们是静态类型语言的巨大优势,但确实需要您实际 查看。
--> 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>()`
不幸的是,这里的 "help" 不是正确的路径,但这只是编译器的猜测。
您正在尝试创建类型为 f64
的随机值并将其分配给包含 &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);
}
我可能不会对任何东西进行零初始化,并将其写为
let mut rng = rand::thread_rng();
let v: Vec<Vec<f64>> = (0..4)
.map(|_| (0..35).map(|_| rng.gen()).collect())
.collect();
println!("vec: {:?}", v);