2017-08-29 38 views
2

我试图在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()各种组合,但没有他们工作。经过一番沮丧之后,我注意到我对解决方案的搜索已经成为蒙特卡罗算法。

回答

5

阅读错误消息 - 它们是静态类型语言的巨大好处,但它确实要求您在其上执行外观

--> 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>()` 

不幸的是,这里的“帮助”不是正确的路径,但它只是编译器的猜测。

您正在尝试创建类型为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); 
+0

太谢谢你了无论是重构代码还是解释问题!我会尽快接受。 并感谢您创建vec的函数式编程方式!如果我能的话,我会给两个+1! –