【问题标题】:How can I fix these two for loops to allow modification of the vector content?如何修复这两个 for 循环以允许修改矢量内容?
【发布时间】:2017-08-29 13:24:30
【问题描述】:

我正在尝试在 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 &amp;.iter().iter_mut() 的各种组合,但它们都不起作用。在一些挫折之后,我注意到我对解决方案的搜索已经变成了蒙特卡洛算法。

【问题讨论】:

    标签: for-loop rust mutable borrowing


    【解决方案1】:

    阅读错误消息——它们是静态类型语言的巨大优势,但它确实需要您真正查看它们。

      --> 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 类型的随机值并将其分配给包含&amp;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 的函数式编程方式!如果可以的话,我会给两个 +1!
    猜你喜欢
    • 2020-10-26
    • 1970-01-01
    • 2016-04-25
    • 2020-03-01
    • 2023-03-14
    • 1970-01-01
    • 2017-03-05
    • 2018-12-08
    • 1970-01-01
    相关资源
    最近更新 更多